Имя шаблона для создания в конструкторе, удаления в деструкторе (C ++) - PullRequest
10 голосов
/ 04 декабря 2009

Традиционно в C ++ вы должны создавать любые зависимости в конструкторе и удалять их в деструкторе.

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

Эта методика / схема получения ресурсов, имеет ли она общее название?
Я уверен, что где-то читал, но сейчас не могу найти.

Edit:
Как отмечали многие, этот класс неполон и должен действительно реализовывать конструктор копирования и оператор присваивания.
Первоначально я намеренно пропустил это, поскольку это не имело отношения к актуальному вопросу: названию шаблона. Однако для полноты и поощрения передовой практики принятым ответом является то, что он есть.

Ответы [ 3 ]

19 голосов
/ 04 декабря 2009

RAII - Инициализация получения ресурсов

14 голосов
/ 04 декабря 2009

Ответ на ваш вопрос: RAII (Инициализация ресурсов - инициализация).

Но ваш пример опасен:

Решение 1 использовать умный указатель:

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

Решение 2: Запомните правило 4:
Если ваш класс содержит «собственный указатель 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 применим ко всем ресурсам, и когда ваш объект содержит ресурс, которым вы должны управлять («Owner RAW Poiner», DB Handle и т. Д.)

2 голосов
/ 04 декабря 2009

Этот метод наиболее известен как RAII - Распределение ресурсов является инициализацией . На этом сайте есть собственный тег .

Alternative. были предложены более интуитивные имена, в частности:

...