如何删除类内类类型的类成员指针

How to delete a class member pointer of the class type inside the class

本文关键字:类型 成员 指针 何删除 删除      更新时间:2023-10-16

我有一段代码,如下所示:

class Base {
public:
Base(){}
Base(int in);
virtual ~Base() { delete b_; }
private:
Base *b_;
int in_;
};
class Derived : public Base {
public:
Derived(){}
~Derived() {}
};
Base::Base(int i) : in_(in){
b_ = new Derived();
}
int main() {
Base *b = new Base(1);
delete b; 
return 0;
}

我在 Base 中删除b_时遇到了分段错误,我想原因是因为它最终会导致对 ~Base(( 的无限递归调用。我还尝试在main((中调用~Derived((,然后删除b,但是由于b_没有释放,因此仍然存在内存泄漏。

所以我的问题是,如果我有这样的代码,释放所有内存的正确方法是什么。我已经寻找了一个解决方案几个小时,没有得到任何令人满意的结果。所以任何建议都会有所帮助,谢谢。

在基类中添加另一个函数,该函数可以

delete b_;

在析构 b 之前在 main(( 中调用它解决了这个问题。

编辑:

经过半天的工作,我终于得出了以下结论:

  1. 问题中发布的代码使用 GCC 编译和运行,但如果我使用 mac 的集成编译器 (clang( 编译它然后运行,它会给我分段错误。
  2. 1. 的原因是删除~Base()内部的b_是一个递归调用,最终会在某个时候删除一个未初始化的指针(一些未初始化的b_(。如果使用 GCC 编译,编译器(或至少是我的编译器(将b_初始化为nullptr(我知道根据 c++ 标准,b_的默认值是未定义的(,这就是程序正常结束的原因。但是对于 clang,编译器没有给b_任何特定的默认值,所以我得到了分段错误。
  3. 解决方法是将b_设置为默认nullptr(在Base的默认构造函数中(,并在~Base()中添加类似以下内容:if (b_ != nullptr) delete b_;