2009-08-18 11 views
1

私はカスタムアロケータを実装しています(私のメモリデバッグユーティリティ内の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); 
    } 
} 

これだけの非常に厄介なようだが、私はそれを改善する方法を見ることができません。

答えて

1

あなたが実際に新しい過負荷などのように、アロケータパラメータを取るために削除することができます。

inline void *operator new(size_t sizeT, Allocator *&a) { 
    return a->allocate(sizeT); 
} 

inline void operator delete(void * mem, Allocator *&a) { 
    a->release(mem); 
} 

int main() 
{ 
    Allocator * a = new Allocator; 
    C *c = new(a) C; 
    c->~C(); 
    operator delete(c, a); 
    return 0; 
} 

は詳細についてwikipedia articleを参照してください。あなたのアロケータが何か特別なことをすれば、通常のdelete演算子を呼び出さないようにしなければならないので、ちょっと面倒です。

+0

それはずっと良い選択です、ありがとう、スタック:) – FlintZA

+1

私がやりたいことは、すべての割り当て割り当ての先頭に関数ポインタがある(32ビットx86アプリケーションで作業する場合は余分な4バイトを追加する必要があります)。これはdealloc関数を指しています記憶を食べた。オブジェクトを削除すると(すべてのオブジェクトはデフォルトの削除演算子で削除できます)、その関数ポインタを呼び出すだけです。 –

+0

興味深い考えは、メモリデバッグのためですか?それがデフォルトのnewにあり、同じ関数ポインタが常に渡された場合、各ポインタで余分な4バイトを取るのではなく、オーバーライドされたdeleteの中で関数を明示的に呼び出すだけではどうですか? – FlintZA

0

destructとは何ですか?私はそれがあるべきとします

void iidebug::CMemoryDebugger::DeleteEntry(iidebug::CMemoryDebugger::CEntry* pEntry) 
{ 
    if (0 != pEntry) 
    { 
     pEntry->~CEntry(); 
     m_entryAllocator.deallocate(pEntry, 1); 
    } 
} 
+0

、破壊は、httpのような破壊を処理するために実装3つのヘルパー関数のいずれかです。 //www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079 – FlintZA

1

誰かがDrewのコードを使用するのに苦労した場合に備えて、ちょっとした調整が必要でした。以下は、私が使用して終了するものである:

template <typename T> 
void* operator new(SizeT iSize, SimpleAllocator<T>& rAllocator) 
{ 
    return rAllocator.allocate(1); 
} 

template <typename T> 
void operator delete(void* pvMemory, SimpleAllocator<T>& rAllocator) 
{ 
    ((T*)pvMemory)->~T(); 
    rAllocator.deallocate(pvMemory, 1); 
} 

そして実際に、それは同じくらい簡単です使用して:

そのことについて申し訳ありません
// SimpleAllocator<CFoo> fooAllocator = ... 
CFoo* pFoo = new(fooAllocator) CFoo(param1, param2, ...); 
// Do stuff with pFoo... 
operator delete(pFoo, fooAllocator); 
関連する問題