执行此操作:
union{
int * integer;
char * character;
} u;
u.integer = new int;
delete u.character;
u.integer = new int[5];
delete [] u.character;我假设如果这些类型中的任何一个都有非平凡的析构函数,那么这将不会起作用,但是这可以吗?
发布于 2011-09-23 22:23:06
这在任何情况下都不起作用,如果我们假设工作意味着拥有定义良好的行为,而不是看起来像是工作(即不崩溃)
发布于 2011-09-23 22:26:07
不,这是未定义的行为,不管项目是否有一个简单的析构函数。如果析构函数是微不足道的,它可能看起来“工作”,而实际上它是内存泄漏,等等。
发布于 2011-09-23 23:07:39
我要说的是,这介于已定义的实现和未定义的实现之间。
5.3.5/2:“在第一种选择(delete对象)中,delete操作数的值可以是...指向由前一个new-expression创建的非数组对象的指针...
指针的值在按照您的方式使用时不会更改,因此,如果使用sizeof(char*) == sizeof(int*),这应该会按预期工作。该特定比较的结果是由实现定义的,如果假设为假,则行为是未定义的。
所以它真的不是特别安全。
https://stackoverflow.com/questions/7530476
复制相似问题