如何删除void指针?

use*_*361 37 c++ pointers void delete-operator

在C++中删除这样的对象有什么不对吗?

MyCls* c = new MyCls();
void* p = (void*)c;
delete (MyCls*)p;
Run Code Online (Sandbox Code Playgroud)

Sti*_*sis 71

这样写是合法的.

演员阵容MyCls*至关重要.如果没有它,您将调用未定义的行为 - 不会调用MyCls析构函数,也可能出现其他问题(例如崩溃).您必须回送到正确的类型.

另请注意,如果涉及多个继承并使用多个强制转换,则此操作可能会很复杂.你的演员必须在任何一个方向"匹配".

如果您的代码的结构使您在销毁时不知道类型,请为每个可删除对象提供一个带有虚析构函数的公共基类.然后在调用delete之前强制转换回基类.


Bri*_*ian 31

代码定义明确.这两种类型转换是静态类型转换,虽然是良好的作风,以更加明确,( static_cast<void*>,等等),而不是使用C-风格的转换.该标准规定,如果指向对象的指针转换为void指针并由静态转换返回,则它将保持其原始值.因此,你的最终delete表达应具有相同的效果delete c.

话虽这么说,使用void*通常是C++中的代码味道.

  • 避免C风格演员的好建议.他们经常比你想做的更多. (4认同)
  • @StilesCrisis,或者更糟糕的是,*比你预期的要少*. (4认同)
  • 也是避免`void*`的好建议.在前Java程序员期望`删除someVoidPointer;`到Just Work ...之后,我有很多关于清理的战争故事. (2认同)