boost::shared_ptr
有一个不同寻常的构造函数
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()
所以...这种不寻常的结构共享一个指针的所有权,但在使用时像另一个指针(它不拥有)一样 起作用,那么它有什么用处呢?
r
的子对象的指针。 - Ben Voigt