Я хочу сделать управление памятью в моем проекте. я не хочу, чтобы оператор global 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 не равен. поэтому память не будет корректной, и информация трассировки выделения не будет удалять coorect тоже... oh...
Есть ли способ решить эту проблему?