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