【问题标题】:What is shared_ptr's aliasing constructor for?shared_ptr 的别名构造函数是干什么用的?
【发布时间】:2020-05-31 11:44:14
【问题描述】:

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

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

  • 一个存储的指针,即它所指向的指针,也是它用 operator* 取消引用的指针。

  • 拥有的指针(可能是共享的),它是所有权组在某个时间点负责删除的指针,它被视为使用。

一般来说,存储的指针和拥有的指针指向同一个对象,但别名 shared_ptr 对象(使用别名构造函数及其副本构造的对象)可能指向不同的对象

然后我阅读了这个页面 (http://www.cplusplus.com/reference/memory/shared_ptr/shared_ptr/) 关于 shared_ptr 的别名构造函数。但我仍然认为这种“混叠”行为令人困惑。 为什么会在这里?它是干什么用的?在什么情况下我需要这个功能?

【问题讨论】:

  • 来自您自己的引用:“[aliasing] 通常用于指向成员对象,同时拥有它们所属的对象。”
  • 你应该已经熟悉别名了,因为 C 和 C++ 默认都允许别名,即使不考虑 shared_ptr 你已经在使用默认允许别名的语言。
  • @hvd 是的。在我发布这个问题后,我后来注意到了这一点。但还是不够具体。

标签: c++ c++11


【解决方案1】:

简单示例:

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 从我们下面被删除时,别名是用的。


正如 Johannes 在 cmets 中指出的那样,有一个有点等价的语言特征:

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

我们正在引用一个临时成员,但只要 specific_data 存在,临时 Foo 仍然保持活动状态。与shared_ptr 示例一样,我们拥有的是一个Bar,其生命周期与Foo 相关联——一个我们无法访问的Foo

【讨论】:

  • but we also don't want the Foo to get deleted out from under us 那是你的shared_ptr 的工作,没有什么真正接近别名的用途。
  • @user2485710 我认为您误解了这个问题?我创建的shared_ptr&lt;Bar&gt; 实际上与shared_ptr&lt;Foo&gt; 共享所有权。所有这一切都只有一个底层对象,但别名构造函数让我们有一个 shared_ptr 指向一个成员。
  • 那么,您的意思是,如果您想重置f,但又不希望f 指向的对象被销毁,因为您需要它的成员对象?哦。非常感谢。我知道了。 q^.^p
  • 也许你可以把这个和struct A { int x; }; const int&amp; x = A().x;比较一下。在这种情况下,只要引用 x 存在,A 对象就会保持活动状态。
  • 请记住这里需要const。常规引用不会延长临时对象的生命周期
猜你喜欢
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 2010-09-23
相关资源
最近更新 更多