如何删除空指针
How to delete void pointer?
在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
之类的,这将自动为你完成上面的操作。
相关文章:
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 为什么 GCC 不优化删除 C++ 中的空指针?
- 删除C++中的空指针
- std::shared_ptr 在空指针上调用非默认删除程序
- 为什么C++中允许删除空指针
- 在删除之前清空指针是否会导致内存泄漏
- 对于空指针,删除程序的标准行为在 shared_ptr 和 unique_ptr 之间是否不同
- 在C++中删除一个空指针被认为是未定义的行为
- 如何删除空指针
- 为空指针指定原始类型后删除该指针