c++ - 聚合 - 如何优雅地释放为对象分配的内存?- 里面的细节
问题描述
(C++) 我发现在以下场景中优雅地管理内存有点麻烦:
我有一个名为 A 的类,它有一个 B 类的成员。B 类有指向 C 类的指针成员:
class C{}
class B{
C* c;
}
class A{
B b;
}
在 A 类的构造函数中,我通过向 B 类传递一个指向刚刚创建的 CI 类对象的指针来初始化 B 类。
现在,在 A 的析构函数中,我想释放传递给 B 的 CI 类的对象。
我知道的所有选项都只是看起来不太优雅:
在 B 中公开 C,这样我就可以这样做:“delete(bc);” 在 B 中创建 c 指针的 getter,然后执行:“delete(b.Getblabla())”保存我作为 A 成员传递的指针,然后释放它:“delete(pointer_to_c)”
你有一些优雅的报价吗?
编辑:嘿,一些澄清,A分配C并将其传递给B的原因是C是一个接口,我希望B用C的不同实现初始化取决于具体情况。
解决方案
A
包含一个类型的对象B
。所以A
不应该自己做任何清理工作。相反,B
应该清理内存,因为那是包含拥有指针的类。
class B {
C *c;
public:
B(C *c) : c(c) {}
~B() { delete c; }
};
当析构函数A
运行时,析构函数B
会运行,这会清理内存。当然,现在您还需要定义复制和移动操作B
。有关详细信息,请参阅3/5/0 规则。
相反,B
可以这样写:
class B {
std::unique_ptr<C> c;
};
现在你不必自己做任何清理工作,因为unique_ptr
会处理好。
推荐阅读
- python - 如何使用循环初始化多个对象,并为每个对象获取不同的用户输入?
- javascript - 卡在 Goomba 的速度并在游戏结束时取消动画
- python - 使用 opencv 在数字和单词周围放置边界框
- macos - Electron 应用程序中带有淡入淡出过渡的全屏
- java - 处理 Java 和 Oracle DB 之间的数百万个请求
- java - 如何在 Java 中为 HashMap 编写 put 方法?
- azure - 作为 Azure 数据工厂的一部分,如何解压缩并执行批处理服务作业
- php - 如何修复 bind_param“无法传递参数”
- java - 即使类存在于具有多个版本的依赖项中,intellij 中的 ClassNotFoundException?
- javascript - 删除整个页面的所有隐藏项,点击输入后