在此页面(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的别名构造函数。但我仍然认为这"别名"行为混乱。 为什么会在这里?它是为了什么?在什么情况下我想要这个功能?
答案 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
相关联。