В Скотте Мейерсе Effective C ++ , пункт 18 Сделать интерфейсы простыми в использовании, правильными и трудными в неправильном использовании , он упомянул null shared_ptr:
std::tr1::shared_ptr<Investment> pInv(static_cast<Investment*>(0), getRidOfInvestment)
и операция присвоения моде
pInv = ... //make retVal point to the correct object
В каком случае может потребоваться создать null shared_ptr и выполнить присвоение позже? Почему бы просто не создать shared_ptr, когда у вас есть ресурсы (необработанный указатель)?
Поскольку Скотт Мейерс не показал полное назначение в предыдущем примере, я подумал, что оператор присваивания shared_ptr перегружен, что можно сделать это:
pInv = new Investment; // pInv will take charge of the pointer
// but meanwhile keep the delete function it already had
Но я попытался с реализацией boost , это не работает таким образом. Тогда какой смысл иметь null shared_ptr?
Я почти уверен, что что-то здесь упускаю, кто-то, пожалуйста, помогите мне.
пс. Подробнее об инициализации и назначении shared_ptr
#include <boost/shared_ptr.hpp>
int main(int argc, char *argv[])
{
boost::shared_ptr<int> ptr1(new int);
boost::shared_ptr<int> ptr2;
ptr2.reset(new int);
boost::shared_ptr<int> ptr3 = new int;
return 0;
}
этот пример не может быть скомпилирован с помощью g ++ (Ubuntu / Linaro 4.5.2-8ubuntu4) 4.5.2 и последней версии:
sptr.cpp: In function ‘int main(int, char**)’:
sptr.cpp:8:39: error: conversion from ‘int*’ to non-scalar type ‘boost::shared_ptr<int>’ requested