如何删除类内类类型的类成员指针
How to delete a class member pointer of the class type inside the class
我有一段代码,如下所示:
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(( 中调用它解决了这个问题。
编辑:
经过半天的工作,我终于得出了以下结论:
- 问题中发布的代码使用 GCC 编译和运行,但如果我使用 mac 的集成编译器 (clang( 编译它然后运行,它会给我分段错误。
- 1. 的原因是删除
~Base()
内部的b_
是一个递归调用,最终会在某个时候删除一个未初始化的指针(一些未初始化的b_
(。如果使用 GCC 编译,编译器(或至少是我的编译器(将b_
初始化为nullptr
(我知道根据 c++ 标准,b_
的默认值是未定义的(,这就是程序正常结束的原因。但是对于 clang,编译器没有给b_
任何特定的默认值,所以我得到了分段错误。 - 解决方法是将
b_
设置为默认nullptr
(在Base
的默认构造函数中(,并在~Base()
中添加类似以下内容:if (b_ != nullptr) delete b_;
相关文章:
- 访问C++中的类型成员
- 具有 STL 向量类型成员的类的复制内存
- 重载具有 2 个相同数据类型成员的构造函数
- std::void_t 和嵌套的非类型成员
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 使用各种数据类型成员创建对象的简便方法
- 将类类型成员定义为公共和私有之间有什么区别?
- 结构类型成员的默认构造函数中的默认参数
- 如何传递模板模板非类型成员函数指针
- 文本类类型成员函数约束
- 给定仅包含布尔类型成员的结构的两个对象 s1 和 s2,只要 s1 的成员为 true,请检查 s2 的每个成员是否为真
- 如何在 c++ 中使用二进制文件输入/输出读取/写入结构的字符串类型成员
- C++:将模板参数的模板类型成员加为好友的语法正确吗
- C++静态结构类型成员初始化
- C++:作为引用或指针的基类型成员变量
- 左值引用类型成员的用户定义移动构造函数
- 具有指针类型成员的类在 MSVS2012@debug 下销毁时失败.程序错误或错误源
- CRTP -- 访问不完整的类型成员
- 为什么C++默认初始化不对非类类型成员进行零初始化
- 请求非类类型成员