删除 void 指针时不调用析构函数
Destructor not invoked when deleting void pointer
我有 3 个类
class A
{
A();
virtual ~A();
}
class B : public A
{
B();
~B();
}
class C
{
void *obj;
C() : obj(nullptr) {}
~C() { if (obj) delete obj; }
}
当我使用类 C
作为类 A
的任何子项的容器并尝试删除C
实例时。 A
,析构函数B
不被初始化是正常的吗?什么是解决方案?
C* instance = new C();
instance.obj = new B();
//Magic
delete instance; // A and B destructor is not called
删除指向不兼容类型(包括void
)的指针会给出未定义的行为。
解决方案是什么?
- 使用正确的类型:使用
new
指定的类型,或者基类(如果具有虚拟析构函数);或 - 使用
std::shared_ptr<void>
,从std::shared_ptr<correct_type>
初始化:它的删除器将做正确的事情。
在这种情况下,看起来您可以简单地存储A*
而不是void*
,因为您说它应该是"任何 A
类子项的容器"。
顺便说一下,在删除指针之前,无需检查指针是否为 null。
你删除了一个void*
,所以delete
不知道它是一个B*
所以不能调用析构函数。如果要在删除时调用析构函数,则必须使用类指针。
例如,是所有可能是 C 的类obj
扩展 A,然后使用 A*
。
是的,删除需要特定的类型。
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常