вопрос о назначении с помощью boost::shared_ptr (по сравнению с функцией reset())

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

Я вижу, что я могу использовать функцию 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, но взгляд на исходный код, похоже, не проясняет для меня вопрос. Надеюсь, кто-то более опытный или знающий сможет мне помочь. Заранее спасибо.


person RandomGuy    schedule 13.09.2010    source источник


Ответы (2)


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

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

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

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


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

person GManNickG    schedule 13.09.2010
comment
Я видел это, но затем я также видел дополнительную информацию, которая, возможно, была противоречивой. Спасибо за проверку на вменяемость. - person RandomGuy; 14.09.2010

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

person Brian R. Bondy    schedule 13.09.2010