首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除带别名的指针

删除带别名的指针
EN

Stack Overflow用户
提问于 2011-09-23 22:20:47
回答 4查看 638关注 0票数 3

执行此操作:

代码语言:javascript
运行
复制
 union{
     int * integer;
     char * character;
 } u;
 u.integer = new int;
 delete u.character;

 u.integer = new int[5];
 delete [] u.character;

我假设如果这些类型中的任何一个都有非平凡的析构函数,那么这将不会起作用,但是这可以吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-23 22:23:06

这在任何情况下都不起作用,如果我们假设工作意味着拥有定义良好的行为,而不是看起来像是工作(即不崩溃)

票数 8
EN

Stack Overflow用户

发布于 2011-09-23 22:26:07

不,这是未定义的行为,不管项目是否有一个简单的析构函数。如果析构函数是微不足道的,它可能看起来“工作”,而实际上它是内存泄漏,等等。

票数 1
EN

Stack Overflow用户

发布于 2011-09-23 23:07:39

我要说的是,这介于已定义的实现和未定义的实现之间。

5.3.5/2:“在第一种选择(delete对象)中,delete操作数的值可以是...指向由前一个new-expression创建的非数组对象的指针...

指针的值在按照您的方式使用时不会更改,因此,如果使用sizeof(char*) == sizeof(int*),这应该会按预期工作。该特定比较的结果是由实现定义的,如果假设为假,则行为是未定义的。

所以它真的不是特别安全。

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

https://stackoverflow.com/questions/7530476

复制
相关文章

相似问题

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