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++中的代码味道.
| 归档时间: |
|
| 查看次数: |
12627 次 |
| 最近记录: |