11

传统上,在 C++ 中,您将在构造函数中创建任何依赖项并在析构函数中删除它们。

class A
{
 public:
    A() { m_b = new B(); }
    ~A() { delete m_b; }
 private:
    B* m_b;
};

这种资源获取的技术/模式,有没有通用的名称?
我很确定我在某处读过它,但现在找不到。

编辑:
正如许多人指出的那样,这个类是不完整的,应该真正实现一个复制构造函数和赋值运算符。
最初,我故意将其省略,因为它与实际问题无关:模式的名称。但是,为了完整性和鼓励良好实践,公认的答案就是这样。

4

3 回答 3

20

RAII - 资源获取是初始化

于 2009-12-04T10:38:38.390 回答
14

您的问题的答案是 RAII(资源获取即初始化)。

但是你的例子很危险:

解决方案 1 使用智能指针:

class A
{
  public:
     A(): m_b(new B) {}
  private:
     boost::shared_ptr<B> m_b;
};

解决方案 2:记住规则 4:
如果您的类包含“Owned RAW 指针”,那么您需要覆盖所有编译器生成的方法。

class A
{
  public:
     A():              m_b(new B)           {}
     A(A const& copy): m_b(new B(copy.m_b)) {}
     A& operator=(A const& copy)
     {
         A  tmp(copy);
         swap(tmp);
         return *this;
     }
    ~A()
     {
         delete m_b;
     }
     void swap(A& dst) throw ()
     {
         using std::swap;
         swap(m_b, dst.m_b);
     }
  private:
     B* m_b;
};

我使用上面的术语“Owned RAW Pointer”,因为它是最简单的例子。但是 RAII 适用于所有资源,并且当您的对象包含您需要管理的资源('Owned RAW Poiner'、DB Handle 等)时。

于 2009-12-04T11:32:17.407 回答
2

这种技术最为人所知的是RAII - 资源分配即初始化。它在这个网站上有自己的标签。

选择。建议使用更直观的名称,特别是:

于 2009-12-04T13:01:24.590 回答