首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么删除不完整的类型被定义为“未定义的行为”?

为什么删除不完整的类型被定义为“未定义的行为”?
EN

Stack Overflow用户
提问于 2014-10-28 12:40:04
回答 2查看 698关注 0票数 4

为什么删除不完整类型被定义为“未定义的行为”

来自C++规范;第5.3.5/5号;

如果被删除的对象在删除点具有不完全类类型,并且完整类具有一个非平凡的析构函数或解分配函数,则行为为未定义的

给出代码示例(我理解为什么这是一个错误);

代码语言:javascript
运行
复制
class ABC;

int main()
{
    ABC* p = nullptr;
    delete p;
}

为什么当gcc、clang和msvc都警告它是不完整的类型时,它被定义为未定义的行为?为什么不只是在这一点上的错误,也就是为什么它不是一个可诊断的错误

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-28 12:50:55

表达式delete p;做了两件事:

  1. 销毁包含*p的完整对象。
  2. 取消分配用于存储所述对象的内存。

项目2可能是可能的,当你只知道对象的地址,没有任何进一步的信息。内存分配器只关心地址。但是确定完整对象的地址可能很困难;您实际上需要保证提供完整对象的地址。

但还有更多。在释放对象的存储之前,必须运行析构函数(第1项)。如果析构函数无效,则不运行析构函数是可以接受的,因为这与运行析构函数的行为相同。但是,如果运行析构函数确实有效果,忽略项目1引线会产生未定义的行为,您需要知道完整的类型,才能知道如何运行析构函数。顺便说一句,您还需要知道完整的类型,以确定项2派生最多的对象的地址。

票数 4
EN

Stack Overflow用户

发布于 2014-10-28 12:44:15

因为,正如你所说的,只有当它有一个非平凡的析构函数或去分配函数时,它才是未定义的行为。如果它是不完整的,编译器不知道是否是这样,所以不知道程序是否定义良好。

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

https://stackoverflow.com/questions/26608611

复制
相关文章

相似问题

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