вопрос о назначении с boost :: shared_ptr (против функции reset ()) - PullRequest
9 голосов
/ 13 сентября 2010

Извините, если на это где-то явно ответили, но меня немного смутила документация буста и статьи, которые я прочитал онлайн.

Я вижу, что могу использовать функцию reset () для освобождения памяти в shared_ptr (при условии, что счетчик ссылок становится равным нулю), например,

shared_ptr<int> x(new int(0));
x.reset(new int(1));

Это, я полагаю, приведет к созданию двух целочисленных объектов, и к концу этих двух строк целое число, равное нулю, будет удалено из памяти.

Но что, если я использую следующий блок кода:

shared_ptr<int> x(new int(0));
x = shared_ptr<int>(new int(1));

Очевидно, что теперь * x == 1 верно, но будет ли исходный целочисленный объект (равный нулю) удален из памяти или я вытекла из этой памяти?

Мне кажется, что это может быть связано с тем, что оператор присваивания уменьшает счетчик ссылок shared_ptr, но взгляд на исходный код, похоже, не проясняет вопрос для меня. Надеюсь, кто-то более опытный или знающий может помочь мне. Заранее спасибо.

Ответы [ 2 ]

15 голосов
/ 13 сентября 2010

Документация довольно понятна:

shared_ptr & operator=(shared_ptr const & r); // never throws

Эффекты: Эквивалент shared_ptr(r).swap(*this).

Так что он просто меняет владение на временный объект, который вы создаете. Временное время истекает, уменьшая счетчик ссылок. (И освобождает, если ноль.)


Назначение этих контейнеров - не пропускать память. Так что нет, вам не нужно беспокоиться об утечках, если вы не пытаетесь все испортить специально. (Другими словами, вам, вероятно, не нужно сомневаться, что Boost знает, что они делают.)

5 голосов
/ 13 сентября 2010

У вас нет утечки памяти.Память для первого объекта int будет удалена.

...