boost::shared_ptr
有着不同尋常的構造什麼是boost的shared_ptr(shared_ptr <Y> const&r,T * p)用於?
template<class Y> shared_ptr(shared_ptr<Y> const & r, T * p);
,我以什麼這將是有益的有點摸不着頭腦。基本上它與r
共享所有權,但.get()
將返回p
。 不是r.get()
!
這意味着你可以做這樣的事情:
int main() {
boost::shared_ptr<int> x(new int);
boost::shared_ptr<int> y(x, new int);
std::cout << x.get() << std::endl;
std::cout << y.get() << std::endl;
std::cout << x.use_count() << std::endl;
std::cout << y.use_count() << std::endl;
}
,你會得到這樣的:
0x8c66008
0x8c66030
2
2
注意,指針是分開的,但他們都聲稱有2的use_count
(因爲他們共享同一個對象的所有權)。
所以,通過x
擁有的int
會存在,只要x
或y
周圍。如果我理解文檔正確,第二個int
永遠不會被破壞。我用下面的測試程序證實了這一點:
struct T {
T() { std::cout << "T()" << std::endl; }
~T() { std::cout << "~T()" << std::endl; }
};
int main() {
boost::shared_ptr<T> x(new T);
boost::shared_ptr<T> y(x, new T);
std::cout << x.get() << std::endl;
std::cout << y.get() << std::endl;
std::cout << x.use_count() << std::endl;
std::cout << y.use_count() << std::endl;
}
該輸出(如預期):
T()
T()
0x96c2008
0x96c2030
2
2
~T()
所以......這是什麼不尋常的結構的這股一個指針的所有權的有效性,但行爲像使用時的另一個指針(它不擁有)。
好問題。 +1 – GManNickG 2009-09-10 05:43:59
TL; DR版本:它創建一個指向「r」子對象的指針。 – 2013-07-13 16:15:41