来自C++17标准(草案这里),expr.new
如果新表达式创建了类类型的对象或对象数组,则对分配函数、解分配函数和构造函数进行访问和模糊控制。如果new-expression 创建了一个类类型对象数组,则有可能调用析构函数.。
为什么new[]要调用析构函数?毕竟是新的。这不是删除。
发布于 2019-03-22 20:34:49
如果缓冲区中任何对象的构造引发异常,则必须销毁先前构造的对象。这需要一个可用的析构函数。
发布于 2019-03-23 07:59:03
在您从标准中提到的引文中,您还没有考虑到“潜在”()一词。
这意味着有可能发生对析构函数的调用。如果数组中的任何对象的构造抛出异常,就会发生这种情况。
结合下面提到[expr.new],的[class.dtor]/12.4引用,这一点变得很清楚了。
在每种情况下,调用的上下文都是对象构造的上下文。析构函数也通过使用新表达式分配的构造对象的delete-表达式来隐式调用;调用的上下文是delete-表达式。:类类型数组包含多个子对象,每个子对象都调用析构函数。 - 尾注 也可以显式调用析构函数。如果析构函数被调用或按照
[expr.new],[class.base.init]和[except.throw]中的指定进行调用,则可能会调用析构函数。如果可能被调用的析构函数被删除或无法从调用的上下文中访问,则程序的格式不正确。
https://stackoverflow.com/questions/55307381
复制相似问题