C++ 如何在类中删除类类型的类成员指针
我有一段代码如下:C++ 如何在类中删除类类型的类成员指针,c++,inheritance,memory,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 Derive
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_u时遇到了分段错误,我想原因是它最终会无限递归地调用~Base()。我还尝试在main()中调用~Derived(),然后删除b,但由于b_u没有被释放,所以仍然存在内存泄漏
所以我的问题是,如果我有这样的代码,那么释放所有内存的正确方法是什么。我已经寻找了几个小时的解决方案,但没有得到任何令人满意的结果。因此,任何建议都会有所帮助,谢谢。在基类中添加另一个函数
delete b_;
在销毁b之前在main()中调用它可以解决问题
编辑:
经过半天的工作,我终于得出以下结论:
~Base()
中删除b
是一个递归调用,最终会在某个点删除未初始化的指针(一些未初始化的b
)。如果用GCC编译,编译器(或者至少是我的编译器)将<代码> By< /COD>初始化为<代码> nulLPTR< /Calp>(我知道根据C++标准,默认值为“代码> By”是未定义的),这就是程序正常结束的原因。但是对于clang,b
编译器没有给出任何特定的默认值,所以我得到了分段错误Base
的默认构造函数中)将b_
设置为nullptr
,并在~Base()
中添加类似的内容:如果(b_!=nullptr)删除b_代码>
为什么基类型会知道一些关于派生类型的信息?每个
派生的都拥有另一个派生的。“那不可能。”谢谢你的指点,我已经说得更清楚了。代码是从一个相当复杂的系统中抽象出来的。它被设计成这样仅仅是因为系统需要它。为什么它有这个要求与当前的主题完全不同……我可能会注意到部分问题是您有一个虚拟析构函数~Base()
,它被非虚拟的~Derived()
覆盖。老实说,我很惊讶这居然被允许。“我在删除b_uu-insidebase时犯了分割错误”——你怎么猜到的?你有没有用调试器介入?因为您显示的代码在调用析构函数之前很久就会导致分段错误。这并不能解决问题。它使症状消失。