首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么new[]表达式会调用析构函数?

为什么new[]表达式会调用析构函数?
EN

Stack Overflow用户
提问于 2019-03-22 20:32:37
回答 2查看 1.4K关注 0票数 40

来自C++17标准(草案这里),expr.new

如果新表达式创建了类类型的对象或对象数组,则对分配函数、解分配函数和构造函数进行访问和模糊控制。如果new-expression 创建了一个类类型对象数组,则有可能调用析构函数.。

为什么new[]要调用析构函数?毕竟是新的。这不是删除。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-22 20:34:49

如果缓冲区中任何对象的构造引发异常,则必须销毁先前构造的对象。这需要一个可用的析构函数。

票数 57
EN

Stack Overflow用户

发布于 2019-03-23 07:59:03

在您从标准中提到的引文中,您还没有考虑到“潜在”()一词。

这意味着有可能发生对析构函数的调用。如果数组中的任何对象的构造抛出异常,就会发生这种情况。

结合下面提到[expr.new],的[class.dtor]/12.4引用,这一点变得很清楚了。

在每种情况下,调用的上下文都是对象构造的上下文。析构函数也通过使用新表达式分配的构造对象的delete-表达式来隐式调用;调用的上下文是delete-表达式。:类类型数组包含多个子对象,每个子对象都调用析构函数。 - 尾注 也可以显式调用析构函数。如果析构函数被调用或按照[expr.new][class.base.init][except.throw]中的指定进行调用,则可能会调用析构函数。如果可能被调用的析构函数被删除或无法从调用的上下文中访问,则程序的格式不正确。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55307381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档