6

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

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

something = buffer;
buffer = NULL;

delete [] something; // undefined??

我首先需要投到somethingchar *

4

2 回答 2

5

是的。

从标准(5.3.5 删除):

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

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

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

于 2010-03-23T17:17:51.547 回答
4

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

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

delete[] buffer

或者

delete[] (char*)something

两者都是有效的。

于 2010-03-23T17:14:26.193 回答