重载运算符new和匹配删除

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.

Ker*_* SB 5

基本口头禅:

没有展示位置删除表达式.

如果使用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函数可能会造成严重的破坏.它恰好在你的程序中解决了.