以下是否会产生未定义的行为:
void * something = NULL;
char * buffer = new char[10];
something = buffer;
buffer = NULL;
delete [] something; // undefined??
我首先需要投到something
吗char *
?
以下是否会产生未定义的行为:
void * something = NULL;
char * buffer = new char[10];
something = buffer;
buffer = NULL;
delete [] something; // undefined??
我首先需要投到something
吗char *
?
是的。
从标准(5.3.5 删除):
删除操作数的值应是从前一个数组 new-expression 产生的指针值。72) 如果不是,则行为未定义。[注意:这意味着 delete-expression 的语法必须与 new 分配的对象的类型匹配,而不是 new-expression 的语法。]
在第一种选择(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数动态类型的基类,并且静态类型应具有虚拟析构函数或行为未定义. 在第二种选择(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为未定义*。
**这意味着不能使用 void 类型的指针删除对象*,因为没有 void 类型的对象。
是的,严格来说,当您使用delete[]
指针的静态类型时,您delete[]
必须与最初分配的数组类型相匹配,否则会出现未定义的行为。
通常,在许多实现中,delete[]
调用 avoid*
实际上是一个类型的数组,它没有重要的析构函数,但不能保证。
delete[] buffer
或者
delete[] (char*)something
两者都是有效的。