什么是shared_ptr的别名构造函数?

时间:2014-11-24 16:22:15

标签: c++ c++11

在此页面(http://www.cplusplus.com/reference/memory/shared_ptr/)第5段中,它说:

  

此外,shared_ptr对象可以在指向另一个对象的同时共享指针的所有权。此功能称为别名(请参阅构造函数),通常用于指向成员对象,同时拥有它们所属的对象。因此,shared_ptr可能与两个指针有关:

     
      
  • 存储指针,它是指向它的指针,以及它与运算符*取消引用的指针。

  •   
  • 一个拥有的指针(可能是共享的),它是所有权组在某个时候负责删除的指针,并且它被视为一种用途。

  •   
     

通常,存储的指针和拥有的指针引用相同的对象,但别名shared_ptr对象(使用别名构造函数及其副本构造的对象)可能引用不同的对象

然后我读了这页(http://www.cplusplus.com/reference/memory/shared_ptr/shared_ptr/)关于shared_ptr的别名构造函数。但我仍然认为这"别名"行为混乱。 为什么会在这里?它是为了什么?在什么情况下我想要这个功能?

1 个答案:

答案 0 :(得分:43)

简单示例:

struct Bar { 
    // some data that we want to point to
};

struct Foo {
    Bar bar;
};

shared_ptr<Foo> f = make_shared<Foo>(some, args, here);
shared_ptr<Bar> specific_data(f, &f->bar);

// ref count of the object pointed to by f is 2
f.reset();

// the Foo still exists (ref cnt == 1)
// so our Bar pointer is still valid, and we can use it for stuff
some_func_that_takes_bar(specific_data);

别名适用于我们真正想要指向Bar的时候,但我们也不希望Foo从我们这里删除。


正如约翰内斯在评论中指出的那样,语言功能有点相同:

Bar const& specific_data = Foo(...).bar;
Bar&& also_specific_data = Foo(...).bar;

我们正在引用临时成员,但只要Foo,临时specific_data仍然有效。与shared_ptr示例一样,我们拥有的是Bar,其生命周期与我们无法访问的Foo - Foo相关联。