我希望在我的项目中进行内存管理。我不想使用全局new/delete操作符,因此我实现了一个简单的内存分配器。以下是我的代码:
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的地址不相等。因此,内存将无法正确释放,分配跟踪信息也无法正确擦除...哦...
有没有解决这个问题的方法?
new
和delete
一样,你只能删除从分配中获得的相同指针。对于多个基类,它们将具有不同的地址,因为显然 A 和 B 不能在同一位置上存在。 - Bo Persson