Перегрузка удаления оператора 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, используется оператор по умолчанию.