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