W Scott Meyers na Efektywne C++, poz 18 Bądź interfejsy łatwy w użyciu prawidłowo i trudny w użyciu nieprawidłowo, wspomniał zerowej shared_ptr:Dlaczego potrzebna jest wartość null shared_ptr i jak można jej użyć?
std::tr1::shared_ptr<Investment> pInv(static_cast<Investment*>(0), getRidOfInvestment)
i operację przypisania vogue
pInv = ... //make retVal point to the correct object
W takim przypadku może być konieczne utworzenie wartości null shared_ptr i wykonanie przypisania później? Dlaczego nie po prostu utworzyć shared_ptr, gdy masz zasoby (nieprzetworzony wskaźnik)?
Od Scott Meyers nie wykazują kompletny zadanie w poprzednim przykładzie, myślałem operator przypisać shared_ptr jest przeciążony, że można to zrobić:
pInv = new Investment; // pInv will take charge of the pointer
// but meanwhile keep the delete function it already had
ale próbowałem z doładowania „s wdrażania go nie działa w ten sposób. Więc jaki jest sens posiadania wartości null shared_ptr?
Jestem prawie pewna, że czegoś tu brakuje, ktoś mi z tego nie pomógł.
ps. więcej o inicjalizacji i przyznaniem 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;
}
ten przykład nie mogą być skompilowane przez g ++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 oraz najnowszej doładowania:
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
Starałem się zrozumieć to tutaj: http://ideone.com/BUjOwZ. Nie mogłem wymyślić wyjaśnienia. –
Jak zauważyli inni, istnieje wiele powodów, dla których warto mieć wartość null shared_ptr, tak jak masz zerowe surowe wskazówki. Ale prawdziwą tajemnicą jest to, dlaczego Scott poczuł potrzebę posiadania niestandardowego deletera. –