Поскольку счетчик и объект используют одно и то же выделение, они также разделяют одно и то же освобождение.
Счетчик должен сохраняться до тех пор, пока не исчезнут последние shared_ptr
и weak_ptr
. Если у вас есть большой объект (или много мелких объектов) с длительными weak_ptr
, это может вызвать конкуренцию за память, если вы выделяете shared_ptr
через make_shared
.
Во-вторых, если у вас есть сторонний API, который передает вам указатель или дескриптор ресурса и, возможно, имеет собственную функцию удаления, make_shared
не подходит и не может использоваться во всех случаях. Создание ваших собственных make_
функций поможет избавиться от лишних деталей, позволит вам справиться с этой проблемой, а также справится с угловым случаем исключения.
Наконец, хотя общие указатели прекрасны, они также слишком мощны. Довольно часто мне нужен unique_ptr
или даже boost::scoped_ptr
, или навязчивый указатель подсчета ссылок, или что-то подобное, чтобы представить собственность. shared_ptr
следует использовать только тогда, когда ситуация фактически предполагает совместное владение ресурсом: его использование волей-неволей, потому что это «просто», как правило, приводит к ресурсному эквиваленту спагетти-кода.
person
Yakk - Adam Nevraumont
schedule
07.10.2013
shared_ptr<int>(new int)
не будет утечки памяти, еслиshared_ptr
конструктор выбросит; что, по-видимому, подразумевает для меня ваш второй пункт. - person Simple   schedule 07.10.2013