Принудительное удаление std :: shared_ptr в C ++ - PullRequest
0 голосов
/ 25 января 2019

Согласно первому ответу в этой статье: Явное удаление shared_ptr

Можно ли принудительно удалить std :: shared_ptr и объект, которым он управляет, как показано ниже:

do {
    ptr.reset();
} while (!ptr.unique());

ptr.reset();  // To eliminate the last reference

Технически, это должно попытаться вызвать std::shared_ptr::reset, если указатель имеет более 1 счетчика ссылок, если он не достигает одного. Есть мысли по этому поводу?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Нет, это невозможно (или желательно).Смысл общего указателя в том, что если он у вас есть, вы можете гарантировать объект, на который он указывает (если таковой имеется), не исчезнет из-под вас, пока (по крайней мере) вы не покончили с ним.

Вызов ptr.reset() только уменьшит количество ссылок на 1 - это ссылка вашего общего указателя.Это никогда не повлияет на другие ссылки из других общих указателей, которые разделяют ваш объект.

0 голосов
/ 25 января 2019

Этот код не имеет никакого смысла.

После сброса ptr он больше не управляет объектом.Если ptr был единственным владельцем shared_ptr, то все готово.Если это не было ... ну, у тебя нет доступа ко всем этим.Вызов reset() для отключенного shared_ptr - это фактически noop - сбросить больше нечего.

Представьте себе простой сценарий:

std::shared_ptr<int> a = std::make_shared<int>(42);
std::shared_ptr<int> b = a; // a and b are sharing ownership of an int

do {
    a.reset();
} while (!a.unique());

Единственный способ сбросить b - этосбросить b - этот код будет сбрасывать только a, он не может достичь b.

Также обратите внимание, что unique() устарел в C ++ 17 и полностью удален в C ++ 20.Но если даже если вы используете use_count() вместо этого, как только вы сделаете a.reset(), a.use_count() будет равен 0, потому что a больше не указывает на объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...