私はカスタムアロケータを実装しています(私のメモリデバッグユーティリティ内のSTLコンテナで、オーバーライドされたnew演算子を使用せずに使用する)。メモリデバッガ内では、同じアロケータクラスのインスタンスを使用して、「通常の」メモリ割り当てを追跡するために必要なオブジェクトを割り当てます。すべて正常に動作しますが、アロケータインターフェイスを使用している方法が正しいかどうかはわかりません。彼らは現在、スタンドとしてここで(エントリの正しい初期化パラメータはすぐに追加されます)ユーティリティメソッドです:オブジェクトをアロケータでインスタンス化する正しい方法は何ですか?
iidebug::CMemoryDebugger::CEntry* iidebug::CMemoryDebugger::NewEntry()
{
CEntry* pEntry = m_entryAllocator.allocate(1);
if (0 != pEntry)
{
new(pEntry) CEntry(0, 0, __FILE__, 0, 0, 0);
}
return pEntry;
}
void iidebug::CMemoryDebugger::DeleteEntry(iidebug::CMemoryDebugger::CEntry* pEntry)
{
if (0 != pEntry)
{
destruct(pEntry);
m_entryAllocator.deallocate(pEntry, 1);
}
}
これだけの非常に厄介なようだが、私はそれを改善する方法を見ることができません。
それはずっと良い選択です、ありがとう、スタック:) – FlintZA
私がやりたいことは、すべての割り当て割り当ての先頭に関数ポインタがある(32ビットx86アプリケーションで作業する場合は余分な4バイトを追加する必要があります)。これはdealloc関数を指しています記憶を食べた。オブジェクトを削除すると(すべてのオブジェクトはデフォルトの削除演算子で削除できます)、その関数ポインタを呼び出すだけです。 –
興味深い考えは、メモリデバッグのためですか?それがデフォルトのnewにあり、同じ関数ポインタが常に渡された場合、各ポインタで余分な4バイトを取るのではなく、オーバーライドされたdeleteの中で関数を明示的に呼び出すだけではどうですか? – FlintZA