如何在类

时间:2018-06-12 04:22:55

标签: c++ inheritance memory

我有一段代码如下:

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()中调用~Endived()然后删除b,但由于b_未被释放,因此仍有内存泄漏。

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

1 个答案:

答案 0 :(得分:-2)

在Base类中添加另一个函数

delete b_;

在破坏b之前在main()中调用它来解决问题。

编辑:

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

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