从分配不同类型的指针释放内存是否安全?

7 c++ memory dynamic

我有一个关于在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 *)pdelete表达,则违反了别名规则.p可以使用指向的对象的有限类型集.C++ 03中的规则可以在另一个问题的答案中找到.C++ 11规则是相似的(差异与您的问题的答案无关).

即使程序没有违反严格的别名规则,也会违反delete表达式的要求.规范陈述(C++11§5.3.5[expr.delete]/3):

如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.

delete表达式中,对象的静态类型是Type2,而动态类型是Type1.类型不同,但静态类型不是动态类型的基类.

  • @ratzip`free`采用`void*`参数,所以演员无所谓. (3认同)