При использовании shared_ptr я должен просто использовать объявление shared_ptr один раз или объявлять shared_ptr везде, где я передаю его?

При использовании shared_ptr я должен просто использовать shared_ptr объявить один раз или объявить shared_ptr везде, где я его передаю?

Итак, в функции, где я создаю экземпляр, я оборачиваю его в shared_ptr, но когда я возвращаю его из функции, я могу также вернуть shared_ptr или, используя get() в shared_ptr просто верните нормальный указатель.

Поэтому мой вопрос заключается в том, должен ли я просто использовать shared_ptr<myType>, когда я создаю новый экземпляр, а затем передаю нормальные указатели или я должен передавать shared_ptr<myType> везде?

c++
7 голосов | спросил CodingHero 5 FebruaryEurope/MoscowbSun, 05 Feb 2012 23:00:16 +0400000000pmSun, 05 Feb 2012 23:00:16 +040012 2012, 23:00:16

1 ответ


0

Создание shared_ptr не наделяет магическими силами его объект pointee. Вся магия в shared_ptr и его копиях. Если вы перестанете его использовать, вы потеряете счет ссылок; хуже того, потому что вы использовали его в какой-то момент , объект будет автоматически удален, когда вы этого не ожидаете.

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

В следующем:

T* foo() {
   shared_ptr<T> sp(new T());
   return sp.get();
   // ^ the only shared_ptr<T> referencing the obj is dead;
   // obj is deleted;
   // returned pointer invalid before you can even do anything with it
}

Ваш указатель недействителен.

Вполне могут быть обстоятельства, при которых вы извлекаете необработанный указатель, но они должны быть редкими. Если вы находитесь в функции, в которой вы знаете , вам не нужен подсчет ссылок, тогда просто передайте shared_ptr по ссылке.

ответил Lightness Races in Orbit 5 FebruaryEurope/MoscowbSun, 05 Feb 2012 23:03:29 +0400000000pmSun, 05 Feb 2012 23:03:29 +040012 2012, 23:03:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132