プロジェクトでメモリ管理を行いたい。オペレーターのグローバルな新規/削除は必要ないので、単純なメモリー割り当てを実装します。これは私のコードです:
class IAllocator
{
public:
void* Alloc( unsigned int size )
{
1. alloc memory.
2. trace alloc.
}
void Dealloc( void* ptr )
{
1. free memory.
2. erase trace info.
}
template< typename T >
void Destructor( T* ptr )
{
if ( ptr )
ptr->~T();
}
};
// macro for use easy.
# define MYNEW( T ) new ( g_Allocator->Alloc( sizeof( T ) ) ) T
# define MYDEL( ptr ) if (ptr) { g_Allocator->Destructor(ptr); g_Allocator->Dealloc(ptr); }
次に、MYNEWを使用してオブジェクトを構築し(メモリリークをチェックするために割り当て情報をトレースします)、MYDELを使用してオブジェクトを破棄します(トレース情報を消去します)。
すべてが正常に見えます...しかし、このメソッドを多重継承クラスに使用しようとすると、非常に深刻な問題が見つかりました。以下の私のテストコードを見てください:
class A { ... };
class B { ... };
class C : public A, public B { ... };
C* pkC = MYNEW( C );
B* pkB = (B*)pkA;
MYDEL( pkB );
pkBとpkAのアドレスが等しくありません。そのため、メモリは正しく解放されず、allocトレース情報もcoorectを消去しません...ああ...
この問題を解決する方法はありますか?</ p>