删除char数组时未定义的行为trought void *

时间:2010-03-23 17:09:45

标签: c++ memory-management undefined delete-operator

以下是否会产生未定义的行为:

void * something = NULL;
char * buffer = new char[10];

something = buffer;
buffer = NULL;

delete [] something; // undefined??

首先我需要将something投射到char *吗?

2 个答案:

答案 0 :(得分:5)

是。

从标准(5.3.5删除):

  

删除操作数的值   应该是指针值   由前一个数组产生   new-expression.72)如果没有,那么   行为未定义。 [注意:这意味着语法   delete-expression必须匹配   new分配的对象的类型,   不是new-expression的语法。   ]

     

在第一种选择中(删除   对象),如果是静态类型的   操作数与其动态不同   类型,静态类型应为基础   操作数的动态类型的类   而静态类型应该有一个   虚拟析构函数或行为是   未定义。在第二种选择   (删除数组)如果动态类型   要删除的对象不同于   它的静态类型,行为是   未定义*

**这意味着无法使用void *类型的指针删除对象,因为没有void类型的对象。

答案 1 :(得分:4)

是的,严格地说,当您使用delete[]指针的静态类型时,delete[]必须与您最初分配的数组类型匹配,否则您将获得未定义的行为。

通常,在许多实现中,delete[]调用void*实际上是一个没有非平凡析构函数的类型的数组,但它不能保证。

delete[] buffer

delete[] (char*)something

都有效。