Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在类中删除类类型的类成员指针_C++_Inheritance_Memory - Fatal编程技术网

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()中调用它可以解决问题

编辑:

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

  • 问题中发布的代码是用GCC编译和运行的,但如果我使用mac的集成编译器(clang)编译并运行它,它会给我带来分段错误
  • 原因1。在
    ~Base()
    中删除
    b
    是一个递归调用,最终会在某个点删除未初始化的指针(一些未初始化的
    b
    )。如果用GCC编译,编译器(或者至少是我的编译器)将<代码> By< /COD>初始化为<代码> nulLPTR< /Calp>(我知道根据C++标准,默认值为“代码> By”是未定义的),这就是程序正常结束的原因。但是对于clang,
    b
    编译器没有给出任何特定的默认值,所以我得到了分段错误
  • 一种解决方法是在默认情况下(在
    Base
    的默认构造函数中)将
    b_
    设置为
    nullptr
    ,并在
    ~Base()
    中添加类似的内容:
    如果(b_!=nullptr)删除b_

  • 为什么基类型会知道一些关于派生类型的信息?每个
    派生的
    都拥有另一个
    派生的
    。“那不可能。”谢谢你的指点,我已经说得更清楚了。代码是从一个相当复杂的系统中抽象出来的。它被设计成这样仅仅是因为系统需要它。为什么它有这个要求与当前的主题完全不同……我可能会注意到部分问题是您有一个虚拟析构函数
    ~Base()
    ,它被非虚拟的
    ~Derived()
    覆盖。老实说,我很惊讶这居然被允许。“我在删除b_uu-insidebase时犯了分割错误”——你怎么猜到的?你有没有用调试器介入?因为您显示的代码在调用析构函数之前很久就会导致分段错误。这并不能解决问题。它使症状消失。