Проблема, с которой я сталкиваюсь, заключается в том, что насколько я знаю, оператор delete должен быть статической функцией, но иногда компилятор (VС++), кажется, рассматривает его как динамический.
Дано:
class Base
{
public:
void* operator new(size_t size) { /* allocate from custom heap */ }
void operator delete(void *p) { customFree(p, sizeof(Base)); }
Base() {}
virtual ~Base() {}
};
class Derived: public Base
{
public:
void* operator new(size_t size) { /* allocate from custom heap */ }
void operator delete(void *p) { customFree(p, sizeof(Derived)); }
Derived() {}
virtual ~Derived() {}
}
То, что я вижу, заключается в том, что удаление базового указателя приведет к вызову Derived::opeator
delete.
Base *p = new Derived();
delete p; //calls Derived::operator delete
Если я не определяю ANY деструкторов, тогда я получаю то, что, как я ожидал, вызывается: вызывается метод Base:: operator delete. Кажется, это происходит потому, что компилятор вводит функцию, называемую "скалярное удаление деструктора) в vtable, когда определен деструктор. Затем эта функция вызовет Derived::delete
.
Поэтому у меня есть вопросы: 1) Это стандартное поведение? 2) Когда я должен использовать
void operator delete( void *, size_t );
против.
void operator delete( void * );
если выше стандартное поведение?