Проблема, с которой я сталкиваюсь, состоит в том, что, насколько я знаю, оператор удаления должен быть статической функцией, но иногда компилятор (VC ++), кажется, рассматривает его как динамический.
Дано:
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
Если я не определяю ЛЮБЫХ деструкторов , тогда я получаю то, что ожидал: вызывается Base :: operator delete. Кажется, это происходит потому, что компилятор вставляет функцию под названием «скалярное удаление деструктор в vtable , когда определен деструктор . Тогда эта функция вызовет Derived::delete
.
Итак, у меня есть вопросы:
1) Это стандартное поведение?
2) Когда я должен использовать
void operator delete( void *, size_t );
против
void operator delete( void * );
если вышеприведенное является стандартным поведением?