我有一个关于在C++中释放内存的问题:
typedef struct type1
{
int a;
int b;
float c;
} Type1;
typedef struct type2
{
int a;
int b;
} Type2;
void *p = new Type1;
delete (Type2 *)p;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,p即使在p被转换为不同大小的类型之后,将被指向的内存区域被完全删除?
Jam*_*lis 14
行为未定义.在这种情况下,动态分配的对象只能通过类型的指针删除Type1.
首先,通过使用由所获得的指针(Type2 *)p在delete表达,则违反了别名规则.p可以使用指向的对象的有限类型集.C++ 03中的规则可以在另一个问题的答案中找到.C++ 11规则是相似的(差异与您的问题的答案无关).
即使程序没有违反严格的别名规则,也会违反delete表达式的要求.规范陈述(C++11§5.3.5[expr.delete]/3):
如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.
在delete表达式中,对象的静态类型是Type2,而动态类型是Type1.类型不同,但静态类型不是动态类型的基类.