这样做的原因是你可以有一个shared_ptr
它指向它所拥有的以外的东西,这是设计使然的。这是使用列为 nr 的构造函数来实现的。 8 上参考参数 http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
A shared_ptr
使用此构造函数创建股权 with r
,但指向ptr
。考虑这个(做作的,但说明性的)代码:
std::shared_ptr<int> creator()
{
using Pair = std::pair<int, double>;
std::shared_ptr<Pair> p(new Pair(42, 3.14));
std::shared_ptr<int> q(p, &(p->first));
return q;
}
一旦这个函数退出,只有一个指向int
该对的子对象可供客户端代码使用。但由于双方共有所有权q
and p
, 指针q
保留整个Pair
物体活着。
一旦释放应该发生,指向整个Pair
对象必须传递给删除器。因此,指针指向Pair
对象必须存储在删除器旁边的某个位置,换句话说,存储在控制块中。
对于一个不太人为的示例(可能更接近该功能的原始动机),请考虑指向基类的情况。像这样的事情:
struct Base1
{
// :::
};
struct Base2
{
// :::
};
struct Derived : Base1, Base2
{
// :::
};
std::shared_ptr<Base2> creator()
{
std::shared_ptr<Derived> p(new Derived());
std::shared_ptr<Base2> q(p, static_cast<Base2*>(p.get()));
return q;
}
当然,真正的实现std::shared_ptr
已就位所有隐式转换,以便p
-and-q
跳舞creator
不是必需的,但我将其保留在那里以类似于第一个示例。