如何删除空指针

How to delete void pointer?

本文关键字:空指针 删除 何删除      更新时间:2023-10-16

在c++中删除这样的对象时是否有任何错误?

MyCls* c = new MyCls();
void* p = (void*)c;
delete (MyCls*)p;

这样写是合法的。

转换回MyCls*是至关重要的。否则,您将调用未定义的行为——不会调用MyCls析构函数,并且还可能出现其他问题(例如崩溃)。必须转换回正确的类型。

还要注意,如果涉及多重继承和使用多重强制转换,这可能会很复杂。你的演员必须在任何一个方向上"匹配"。

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

代码定义良好。这两个类型转换都是静态类型转换,尽管将其显式(static_cast<void*>)而不是使用c风格的类型转换是很好的风格。该标准规定,如果通过静态强制转换将指向对象的指针转换为void指针并转换回来,则该指针将保持其原始值。因此,最终的delete表达式应该与delete c具有相同的效果。

话虽如此,在c++中使用void*通常是一种代码气味。

虽然这段代码是有效的,但它不是一个好的实践。

作为一般原则,不应该有new s和delete s在野外。试着执行一个规则,只有构造函数可以调用new,只有析构函数可以调用delete,这将有助于你更好地组织你的代码。

如果你使用的是c++ 11,总是尝试std::shared_ptr之类的,这将自动为你完成上面的操作。