Zee*_*bit 2 c++ inheritance new-operator delete-operator
我在一个子类中重载operator new/delete,我注意到一个对我来说似乎很奇怪的行为.看看下面的示例代码:
#include <stdlib.h>
#include <stdio.h>
class Base
{
public:
virtual ~Base()
{
}
};
class Derived : public Base
{
public:
void* operator new(unsigned int size, int capacity)
{
printf("> new(unsigned int, int)\n");
return malloc(sizeof(Derived));
}
void operator delete(void* ptr, int)
{
printf("> delete(void*, int)\n");
free(ptr);
}
void operator delete(void* ptr)
{
printf("> delete(void*)\n");
free(ptr);
}
};
int main(int argc, char** argv)
{
Base* base = new (0) Derived();
delete base;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用Visual Studio 2010编译时,此代码生成以下输出:
> new(unsigned int, int)
> delete(void*)
Run Code Online (Sandbox Code Playgroud)
为什么匹配删除operator(Derived::operator delete(void*, int))不会在这里被调用?无论我做什么,我都无法获取代码来调用匹配的运算符delete.
基本口头禅:
没有展示位置删除表达式.
如果使用placement-new创建对象,则必须手动销毁它,然后调用释放函数:
Base * p = new (0) Derived;
p->~Derived();
Derived::operator delete(p, 0);
Run Code Online (Sandbox Code Playgroud)
如果你愿意,那么delete base;在你的代码中说它是一种未定义的行为,因为你从未获得base过标准new-expression的结果.您完全有可能定义了一个放置新的分配函数,它完成了一些完全不同的操作,并且调用标准的operator delete-deallocation函数可能会造成严重的破坏.它恰好在你的程序中解决了.