假设代码执行以下操作:
T *pointer = new T();
delete static_cast<void*>(pointer);
结果是什么?未定义,内存泄漏,内存被删除?
假设代码执行以下操作:
T *pointer = new T();
delete static_cast<void*>(pointer);
结果是什么?未定义,内存泄漏,内存被删除?
行为未定义。关于删除表达式,C++ 标准说:
在第一种选择(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数动态类型的基类,并且静态类型应具有虚拟析构函数或行为未定义. 在第二种选择(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为未定义。(§5.3.5/3)
然后本段的脚注明确指出:
这意味着不能使用类型指针删除
void*
对象,因为没有类型对象void
(注释 73)。
通过 void 指针删除是未定义的,就像通过 void 指针执行任何其他操作一样,除了将其显式转换为另一种指针。