运算符new和删除继承类。操作员删除不执行

时间:2017-11-14 06:27:04

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

我正在搞乱运算符重载,我注意到在继承的对象上,当继承的对象有一个新的重载运算符时,重载的运算符delete似乎没有执行:

Overloaded operator new!

上面的代码有以下输出:

data-dismiss="modal"

重载运算符删除发生了什么? 提前谢谢大家!

更新: 谢谢大家的帮助。似乎问题确实是重载新的返回的nullptr。

2 个答案:

答案 0 :(得分:2)

在C ++ 14及更高版本中删除nullptr始终是无操作。什么都没有被调用。要使您的示例有效,您需要返回一个非null的指针。例如:

void* operator new(size_t) throw()
{
    std::cout << "Overloaded operator new!\n";
    return ::new Test;
}

来自cppreference

  

如果expression计算为空指针值,则不会调用析构函数,并且不会调用释放函数

以上是针对C ++ 14及更高版本的。直到C ++ 11,可能会调用释放函数。它是实现定义的:

  

如果表达式求值为空指针值,则不调用析构函数,可以调用或不调用(它是实现定义的),但默认的释放函数可以保证交出空​​指针时没什么。

答案 1 :(得分:1)

如果您只返回一个非空指针值的地址,您的代码工作。引用C ++标准:

[class.free]/4

  

特定于类的释放函数查找是一般的一部分   解除分配函数查找([expr.delete])并发生如下。如果   delete-expression用于释放其对象的类对象   static类型有一个虚拟析构函数,deallocation函数是   在动态类型的虚拟定义点选择一个   析构函数([class.dtor])。

[class.dtor]/13

  

定义虚拟析构函数(包括   隐式定义),非数组释放函数是   确定为表达式删除它出现在a中   析构函数类的非虚析构函数(参见[expr.delete])。   如果查找失败或者释放功能已删除   定义,该计划是不正确的。 [注意:这保证了一个   对应于动态对象类型的释放函数   可用于delete-expression([class.free])。 - 尾注]

[expr.delete]/6

  

如果delete-expression的操作数值不为null   指针值,delete-expression将调用析构函数(如果   any)对象或被删除数组的元素。

您只是以不会在delete表达式调用任何内容的方式进行设置。我修复了它以转发到全局运算符new和delete,一切都按预期工作。 The code is on Coliru Viewer