shared_ptr как член класса - PullRequest
8 голосов
/ 10 мая 2010

Распространено объявлять содержащиеся объекты как указатели на этот класс, в то время как «объявляют» их в заголовочном файле. Это для того, чтобы уменьшить физические зависимости в коде.

Например

class B;  // forward declaration   

class A {
   private:
      B* pB;
};

Было бы неплохо объявить такого члена как shared_ptr вместо голого указателя?

Я бы предпочел scoped_ptr, но AFAIK это не будет в стандарте.

Ответы [ 4 ]

5 голосов
/ 10 мая 2010

Да, вы можете (должны?).

Это обычная практика . Как вы заявили, это устраняет необходимость явного вызова delete ().

Ты можешь пойти еще дальше. Вот пример:

class RSAKey
{
  public:

    RSAKey();

  private:

    shared_ptr<RSA> d_rsa; // A pointer to a RSA structure from OpenSSL
}

Который я инициализирую так:

RSAKey::RSAKey()
{
  RSA* rsa = RSA_generate_key(1024, 1, NULL, NULL);

  if (NULL == rsa) throw DummyException();

  d_rsa.reset(rsa, RSA_free); // Note the specific release method.
}

Когда d_rsa больше не будет использоваться, произойдет автоматический вызов RSA_free(). Разве это не круто?!


Обновление

Если C++11 является опцией, вам, вероятно, лучше использовать std::unique_ptr вместо него, который имеет меньше накладных расходов и является подвижным.

Это зависит от того, как вы хотите, чтобы ваш включающий класс вел себя в отношении копирования.

2 голосов
/ 10 мая 2010

Если этот указатель не выходит за пределы реализации вашего класса, и скорость выполнения имеет решающее значение, используйте scoped_ptr вместо shared_ptr. У shared_ptr накладные расходы.

1 голос
/ 10 мая 2010

Использование shared_ptr позволит вам передать право собственности на другой объект, чтобы он не разрушался при разрушении вашего внешнего объекта. Вы заявляете, что это не будет проблемой в данном конкретном случае.

Единственное преимущество, которое будет иметь умный указатель, состоит в том, что вам не нужно помнить, чтобы вставить delete pB в свой деструктор. Это может быть достаточным преимуществом для большинства людей.

Если вам не нужно беспокоиться о правах собственности, даже auto_ptr будет достаточно.

0 голосов
/ 10 мая 2010

В случае композиции, да, это хорошая идея, если вы не хотите физической зависимости. Тогда ваш B будет уничтожен автоматически, когда A.

Если вы не возражаете против физической зависимости, вы можете просто удерживать элемент данных по значению.

(Вы также можете проверить идиому pimpl, если физическая зависимость является проблемой.)

...