首页 > 解决方案 > 聚合 - 如何优雅地释放为对象分配的内存?- 里面的细节

问题描述

(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的不同实现初始化取决于具体情况。

标签: c++memory-managementaggregation

解决方案


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会处理好。


推荐阅读