【问题标题】:Overloaded operator new and matching delete重载运算符 new 和匹配删除
【发布时间】:2013-05-16 19:16:31
【问题描述】:

我在一个子类中重载了 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;
}

此代码在使用 Visual Studio 2010 编译时会生成以下输出:

> new(unsigned int, int)
> delete(void*)

为什么这里没有调用匹配的删除运算符 (Derived::operator delete(void*, int))?无论我做什么,我都无法获取调用匹配运算符删除的代码。

【问题讨论】:

    标签: c++ inheritance new-operator delete-operator


    【解决方案1】:

    基本口头禅:

    没有放置删除表达式。

    如果你使用placement-new创建一个对象,你必须手动销毁它,然后调用deallocation函数:

    Base * p = new (0) Derived;
    
    p->~Derived();
    
    Derived::operator delete(p, 0);
    

    如果您愿意,在您的代码中说delete base; 是一种未定义的行为,因为您从未获得base 作为标准新表达式的结果。您完全有可能定义了一个完全不同的放置新分配函数,调用标准的operator delete-deallocation 函数可能会造成严重破坏。碰巧在你的程序中它成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 2012-08-04
      • 2014-03-26
      • 2018-07-19
      • 2018-07-16
      相关资源
      最近更新 更多