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)
我首先需要投something来char *?
是.
从标准(5.3.5删除):
delete的操作数的值应该是由前一个数组new-expression产生的指针值.72)如果不是,则行为是未定义的.[注意:这意味着delete-expression的语法必须与new分配的对象的类型匹配,而不是new-expression的语法.]
在第一个替代(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.在第二个备选(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为未定义*.
**这意味着无法使用void*类型的指针删除对象,因为没有void类型的对象.
是的,严格来说,当您使用delete[]指针的静态类型时,您delete[]必须与最初分配的数组的类型匹配,否则您会得到未定义的行为。
通常,在许多实现中,delete[]调用 avoid*实际上是没有非平凡析构函数的类型的数组,但不能保证。
delete[] buffer
Run Code Online (Sandbox Code Playgroud)
或者
delete[] (char*)something
Run Code Online (Sandbox Code Playgroud)
两者都有效。