我遇到的问题是,据我所知,delete运算符应该是一个静态函数,但有时编译器(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::operator
delete。
Base *p = new Derived();
delete p; //calls Derived::operator delete
如果我不定义任何析构函数,那么我得到的结果正好是我所期望的:调用Base::operator delete。这似乎是因为当定义了析构函数时,编译器会向vtable中插入一个名为“scalar deleting destructor”的函数。然后该函数将调用Derived::delete。
所以我有两个问题: 1)这是标准行为吗? 2)什么情况下应该使用?
void operator delete( void *, size_t );
对比。
void operator delete( void * );
如果上述是标准行为?