Есть ли различия между двумя фрагментами кода ниже? Является ли какой-либо из них предпочтительнее другого?
оператор=
boost::shared_ptr<Blah> foo; // foo.ptr should be NULL
foo = boost::shared_ptr<Blah>(new Blah()); // Involves creation and copy of a shared_ptr?
сбросить
boost::shared_ptr<Blah> foo; // foo.ptr should be NULL
foo.reset(new Blah()); // foo.ptr should point now to a new Blah object
Примечание. Мне нужно определить shared_ptr, а затем установить его в другой строке, потому что я использую его в фрагменте кода, например:
boost::shared_ptr<Blah> foo;
try
{
foo.reset...
}
foo...
new
и инициализация с его помощьюshared_ptr
— это двухэтапный процесс. Теоретически создание объекта может завершиться успешно, но инициализацияshared_ptr
может завершиться неудачно, и в этом случае произойдет утечка памяти, если вы явно не обработаете этот случай.make_shared
позаботится об этом за вас. Согласно документации, это также быстрее. 15.03.2013