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

Hot*_*ead 6 c++ memory-management undefined delete-operator

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

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

something = buffer;
buffer = NULL;

delete [] something; // undefined??
Run Code Online (Sandbox Code Playgroud)

我首先需要投somethingchar *

sin*_*nek 5

是.

从标准(5.3.5删除):

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

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

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


CB *_*ley 4

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

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

delete[] buffer
Run Code Online (Sandbox Code Playgroud)

或者

delete[] (char*)something
Run Code Online (Sandbox Code Playgroud)

两者都有效。