C++ 在基析构函数导致问题之前调用派生析构函数

C++ 在基析构函数导致问题之前调用派生析构函数,c++,C++,这是我的问题: 我的基类有一个构造函数,它接受一个类指针,如果该指针为NULL,它就知道自己实例化并维护它 问题是,在base析构函数中,我必须用base的私有内容注销该指针。因此,当我尝试调用基析构函数中的类指针,而派生函数正在维护它时,它已经被释放了。这就产生了一个问题。我能做什么 感谢构造函数和析构函数在继承中的顺序是相反的;基构造函数在其任何派生构造函数之前被调用。删除时,会发生相反的情况-首先删除派生类 为了解决您的问题,基类析构函数能否不测试其私有实例是否为NULL呢?如果基类为指针

这是我的问题:

我的基类有一个构造函数,它接受一个类指针,如果该指针为NULL,它就知道自己实例化并维护它

问题是,在base析构函数中,我必须用base的私有内容注销该指针。因此,当我尝试调用基析构函数中的类指针,而派生函数正在维护它时,它已经被释放了。这就产生了一个问题。我能做什么


感谢

构造函数和析构函数在继承中的顺序是相反的;基构造函数在其任何派生构造函数之前被调用。删除时,会发生相反的情况-首先删除派生类

为了解决您的问题,基类析构函数能否不测试其私有实例是否为NULL呢?

如果基类为指针创建了一个实例,为什么不能释放它呢?有什么东西阻止你把自由移动到基础析构函数中吗


在某个层级上,在谁做什么的问题上保持一致总是最好的——将相同的责任分散在几个层级上肯定会导致这样的问题。更不用说,如果您想创建另一个从基类继承的类,您还必须在新类中重新实现此管理,创建代码复制。

根据您的描述,我推断,有时派生类将负责此指针,有时基类将负责此指针。我能想到的最简单的解决方案是在基类中添加一个布尔值,这将允许您跟踪对象的所有者。如果基类已初始化指针,则将布尔值设置为true。然后,析构函数可以检查对象的所有者,然后检查对象是否应该清理


更好的解决方案是使用boost:shared\u ptr。这是一个引用计数指针抽象,当对象的最后一个引用超出范围时,它将自动清理对象。使用此抽象,您通常不需要担心谁会释放指针。

基类可以实现一个受保护的成员函数来执行清理,然后派生析构函数可以在销毁资源之前调用此帮助函数。

如果构造函数分配内存,相应的析构函数负责释放它。如果有条件地分配内存,则需要有条件地释放内存。布尔标志将帮助您确定是否发生了分配


另一种解决方案是使用引用计数。分配时,参考计数应为1。如果另一个类对该对象感兴趣,它将通过增加引用计数来保留指针。如果类对对象不再感兴趣,则会减少引用计数。当计数器达到0时,必须删除该对象。SyrdYPPTR是一个标准的C++引用计数自动指针实现,它在复杂的混合所有制情况下工作得很好。< / P>是的,我可以这样做,除非我仍然需要调用那个尖对象的函数,否则会引起问题。