Я знаю, как используется weak_ptr
, я прочитал следующий пост:
О «циклической ссылке», я использовал слабый_птр, но утечка памяти все же произошла
Но есть концепция, которую я пока не могу понять.
Я покажу, как shared_ptr
создан и выпущен, насколько я понимаю:
1. shared_ptr
pa
создано
reference_count
из pa
должно быть 0
. Потому что нет shared_ptr
указывает на pa
.
{/*scope 1*/
shared_ptr<int> pa;
// reference_count_pa = 0
}
2. Я назначаю новые shared_ptr<int>
pb
для pa
в другой области
{/*scope 1*/
shared_ptr<int> pa;
{/*scope 2*/
shared_ptr<int> pb = pa;
// reference_count_pa = 1
// reference_count_pb = 0
}
}
reference_count
из pa
должно быть 1
, поскольку shared_ptr
pb
указывает на pa
.
reference_count
из pb
должно быть 0
, поскольку shared_ptr
не указывает на pb
.
3. Теперь, простое Circular Reference
:
, как показано в О «круговой ссылке», я использовал слабый_птр, но утечка памяти все же произошла :
{/*scope 1*/
shared_ptr<int> pa;
{/*scope 2*/
shared_ptr<int> pb = pa;
pa = pb; //circular reference
// reference_count_pa = 1
// reference_count_pb = 1
}
}
reference_count
из pa
должно быть 1
, потому что shared_ptr
pb
указывает на pa
reference_count
из pb
должно быть 1
, поскольку shared_ptr
pa
указывает на pb
4. В конце scope 2
pb
удаляется, потому что программа выходит из scope 2
.
reference_count
из pa
равно 0
, потому что нет shared_ptr
указывает на pa
.
reference_count
из pb
по-прежнему 1
.
5. В конце scope 1
reference_count
из pb
означает 0
сейчас, потому что shared_ptr
не указывает на pb
.
Вышеуказанные шаги reference_count, насколько я понимаю.
pa
и pb
удаляются нормально.
Я в замешательстве.
Может кто-нибудь исправить мою ошибку в вышеуказанных шагах ?
Спасибо!