Перегрузка удаления оператора C++ не работает для производного класса

Я пытаюсь перегрузить специфичные для класса операторы new и delete, чтобы использовать собственный распределитель, для некоторого абстрактного базового класса:

class Base abstract
{
public:
void * operator new (size_t sz)
{
   return tc_malloc(sz);
}
void operator delete(void* p){
   tc_free(p)
}

и у меня есть класс "Производный" наследует от базы (не напрямую, это сложная цепочка наследования, но в конечном итоге он является производным от базы), и имеют:

a = new Derived();
.
.
delete a;

теперь происходит странная вещь.. мой оператор new вызывается, вызывая tc_malloc, но для "delete a;" оператор delete вызывается из delete_scalar.cpp (оператор удаления по умолчанию), это, конечно, вызывает исключение, поскольку он пытается освободить память, не выделенную malloc.

Есть идеи, что может вызвать это?

2 ответа

Итак, я обнаружил проблему: причина в том, что delete был вызван для неполного класса. более конкретно, у меня был файл.h, который выглядел примерно так:

class A; //forward declaration
class User {
   A* a;
   User();
   ~User(){
      delete a; //this is the problem
}

поэтому delete вызывается для неполного типа с неопределенным поведением. поэтому здесь не вызывается ни деструктор, ни оператор удаления, специфичный для класса

Я думаю C++ Виртуальный оператор удалить? может помочь понять, что здесь происходит.

Если я правильно понимаю, всегда используется оператор удаления наиболее производного класса, поэтому он должен использовать оператор из Derived. И, похоже, поскольку вы не объявили его для Derived, используется оператор по умолчанию.

Другие вопросы по тегам