我正在搞乱运算符重载,我注意到在继承的对象上,当继承的对象有一个新的重载运算符时,重载的运算符delete似乎没有执行:
Overloaded operator new!
上面的代码有以下输出:
data-dismiss="modal"
重载运算符删除发生了什么? 提前谢谢大家!
更新: 谢谢大家的帮助。似乎问题确实是重载新的返回的nullptr。
答案 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 ++标准:
特定于类的释放函数查找是一般的一部分 解除分配函数查找([expr.delete])并发生如下。如果 delete-expression用于释放其对象的类对象 static类型有一个虚拟析构函数,deallocation函数是 在动态类型的虚拟定义点选择一个 析构函数([class.dtor])。
定义虚拟析构函数(包括 隐式定义),非数组释放函数是 确定为表达式删除它出现在a中 析构函数类的非虚析构函数(参见[expr.delete])。 如果查找失败或者释放功能已删除 定义,该计划是不正确的。 [注意:这保证了一个 对应于动态对象类型的释放函数 可用于delete-expression([class.free])。 - 尾注]
如果delete-expression的操作数值不为null 指针值,delete-expression将调用析构函数(如果 any)对象或被删除数组的元素。
您只是以不会在delete
表达式调用任何内容的方式进行设置。我修复了它以转发到全局运算符new和delete,一切都按预期工作。 The code is on Coliru Viewer