Популярное широкое использование shared_ptr почти неизбежно вызовет нежелательную и невидимую занятость памяти.
Циклические ссылки - хорошо известная причина, и некоторые из них могут быть косвенными и трудными для обнаружения, особенно в сложном коде, который обрабатывается более чем одним программистом; программист может решить, что один объект нуждается в ссылке на другую в качестве быстрого исправления и не успевает изучить весь код, чтобы увидеть, закрывает ли он цикл. Эта опасность сильно недооценивается.
Менее понятна проблема невыпущенных ссылок. Если объект разделяется на многие shared_ptrs, он не будет уничтожен, пока каждый из них не обнуляется или не выходит за рамки. Очень легко упускать из виду одну из этих ссылок и в конечном итоге скрывать невидимые в памяти объекты, которые, как вы думали, вы закончили.
Хотя, строго говоря, это не утечка памяти (все будет выпущена до выхода программы), они настолько же вредны и сложнее обнаружить.
Эти проблемы являются следствием целесообразных ложных заявлений: 1. Объявляя, что вы действительно хотите быть единым владением как shared_ptr. scoped_ptr будет правильным, но тогда любая другая ссылка на этот объект должна быть необработанным указателем, который может быть оставлен болтающимся. 2. Объявление того, что вы действительно хотите быть пассивной ссылкой наблюдения как shared_ptr. weak_ptr будет правильным, но тогда у вас возникнут проблемы с преобразованием его в share_ptr каждый раз, когда вы хотите его использовать.
Я подозреваю, что ваш проект - прекрасный пример проблемы, с которой эта практика может вас заинтересовать.
Если у вас есть приложение с интенсивной памятью, вам действительно требуется единое владение, чтобы ваш проект мог явным образом управлять временем жизни объекта.
Одинарное владение opObject = NULL; обязательно удалит объект, и он сделает это сейчас.
с долевой собственностью spObject = NULL; ........ кто знает? ......
Большое спасибо! Есть около 200 тысяч строк. Так что сложно проверить каждый новый ... есть ли какой-либо макрос компилятора, чтобы активировать функцию проверки ref ref (если такая способность существует). Я уверен, что память вызывает программирование логической ошибки о пулах, но я просто не могу ее найти. – user25749
У вас все еще есть утечки памяти с shared_ptrs. Создайте циклическую ссылку, и она никогда не будет удалена, даже если остальная часть приложения больше не ссылается на нее. Мгновенная утечка памяти! – jalf
Ссылка на объект, который некорректно сохраняется, по-прежнему является утечкой ресурсов. Вот почему программы GC все еще могут иметь утечки, обычно из-за шаблона Observer - наблюдатель находится в списке вместо наблюдаемого и никогда не снимается с него. В конечном счете, для каждого 'add' требуется' remove', так же как 'delete' требуется для каждого' нового'. Точно такая же ошибка программирования, вызывающая точно такую же проблему. «Ресурс» - это действительно пара функций, которые нужно называть равным числом раз с соответствующими аргументами, а «утечка ресурсов» - это то, что происходит, когда вы этого не делаете. –