以下是否会产生未定义的行为:
void * something = NULL;
char * buffer = new char[10];
something = buffer;
buffer = NULL;
delete [] something; // undefined??
首先我需要将something
投射到char *
吗?
答案 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
都有效。