我有一段代码如下:
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_未被释放,因此仍有内存泄漏。
所以我的问题是,如果我有这样的代码,那么释放所有内存的正确方法是什么。我已经搜索了几个小时的解决方案而没有获得任何令人满意的结果。所以任何建议都会有所帮助,谢谢。
答案 0 :(得分:-2)
在Base类中添加另一个函数
delete b_;
在破坏b之前在main()中调用它来解决问题。
编辑:
经过半天的工作,我终于得出以下结论:
b_
内删除~Base()
的原因是递归调用,并且最终会在某个时刻删除未初始化的指针(某些未初始化的b_
)。如果使用GCC进行编译,编译器(或者至少是我的编译器)会将b_
初始化为nullptr
(我知道根据c ++标准,b_
的默认值是未定义的),那就是为什么程序正常结束。但是对于clang,编译器没有给b_
任何特定的默认值,所以我得到了分段错误。b_
设置为nullptr
(在Base
的默认构造函数中)并在~Base()
内添加类似内容:if (b_ != nullptr) delete b_;