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
请注意,指针是分开的,但它们都声称 ause_count
为 2(因为它们共享同一对象的所有权)。
因此,只要或int
存在,所拥有的就会存在。如果我理解文档正确,第二个永远不会被破坏。我已经通过以下测试程序确认了这一点:x
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()
那么......这个不寻常的结构有什么用处,它共享一个指针的所有权,但在使用时就像另一个指针(它不拥有)。