【发布时间】:2010-11-27 01:41:19
【问题描述】:
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
请注意,这些指针是分开的,但它们都声称 use_count 为 2(因为它们共享同一对象的所有权)。
所以,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
-
TL;DR 版本:它创建一个指向
r的子对象的指针。
标签: c++ boost shared-ptr smart-pointers