C ++ primer 5 edition: Контейнер shared_ptr - PullRequest
1 голос
/ 20 октября 2019

Снова читаю C ++ Primer 5 Edition. Я нахожусь на главе 12 Динамическая память. Все хорошо. До этого момента в книге:

"Поскольку память не освобождается до тех пор, пока не исчезнет последний shared_ptr, важно быть уверенным, что shared_ptrs не останется после того, как они больше не нужны. Программа будетвыполняется правильно, но может тратить впустую память, если вы пренебрегаете уничтожением shared_ptrs, в котором программа не нуждаетсявсе элементы. Вы должны обязательно стереть элементы shared_ptr, как только вам эти элементы больше не нужны.

Примечание

Если вы поместили shared_ptrs в контейнер, и впоследствии вам нужно будет использовать некоторые из них, ноне все элементы, не забудьте стереть элементы, которые вам больше не нужны. "

  • Я не понимаю, этот абзац может кто-нибудь объяснить мне, как могут shared_ptr s утечки? и пример «контейнера» shared_ptr, который может вызвать утечку. Спасибо.

1 Ответ

3 голосов
/ 20 октября 2019

По сути это означает, что до тех пор, пока в вашем контейнере есть объект std::shared_ptr, объект, на который он указывает, не будет удален.

Так что, как только вы больше не используете этот объект, вы должны удалитьсоответствующий std::shared_ptr из вашего контейнера, так что хранилище может быть освобождено.

Если бы вы продолжали добавлять элементы в свой контейнер и никогда не удаляли их, вы бы по существу утратили память (ofc это будет очищено, когдаколичество ссылок достигает 0, но до тех пор оно зарезервировано без причины).


Примечание, убедитесь, что вы всегда думаете о том, когда используете std::shared_ptr. Часто std::unique_ptr достаточно, и если возникает необходимость сделать его доступным, это легко сделать. См. Могут ли C ++ 11 unique_ptr и shared_ptr конвертировать в типы друг друга?

также

https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rr-unique

...