Умные указатели владения и срока службы - PullRequest
0 голосов
/ 19 февраля 2020

Существуют две концепции (владение, время жизни), которые важны при использовании интеллектуальных указателей C ++ (уникальные, общие, слабые). Я пытаюсь понять эти концепции и то, как они влияют на использование интеллектуальных указателей (или необработанных указателей).

Я прочитал два правила:

  1. Всегда используйте умные указатели для управления владением / временем жизни динамического объекты.
  2. Не используйте умные указатели, когда не управляете владением / временем жизни.

Пример:

class Object
{
   public:
      Object* child(int i) { return mChildren[i]; }
      // More search and access functions returning pointers here

   private:
      vector<Object*> mChildren;
};

Я хочу переписать это с помощью умных указателей , Давайте сначала проигнорируем child (). Простая игра. Родитель владеет своими детьми. Поэтому сделайте mChildren вектором unique_ptr.

Согласно вышеупомянутым правилам, некоторые люди утверждают, что child (i) должен продолжать возвращать необработанный указатель.

Но разве это не рискованно? Кто-то может делать глупые вещи, такие как удаление возвращаемого объекта, что затрудняет отладку cra sh ... которого можно избежать, используя в качестве возвращаемого значения слабый_птр или shared_ptr.

Нельзя ли сказать, что копирование указатель всегда означает временное разделение владельца и / или утверждение срока жизни объекта?

Стоит ли использовать умные указатели для детей, только если я не получаю более безопасный API?

1 Ответ

0 голосов
/ 19 февраля 2020

Вы можете вернуть const std::unique_ptr<Object>&, который позволит вам иметь ту же семантику необработанного указателя для вызова методов на нем, при этом предотвращая удаление.

Использование std::unique_ptr с необработанным указателем имеет смысл, когда вы знаете, что владелец переживет любой необработанный указатель, и вы уверены, что люди не будут пытаться delete указатель напрямую. Так что это отличается от использования std::weak_ptr и std::shared_ptr, потому что они вообще не позволят вам использовать висячие указатели.

Всегда есть место, чтобы сделать что-то не так, поэтому ответ действительно зависит от специфики c ситуация, когда этот код будет использоваться и тому подобное.

...