【问题标题】:Can pointer 'this' be a shared pointer?指针“this”可以是共享指针吗?
【发布时间】:2016-06-02 17:37:08
【问题描述】:

我对 C++ 中的 this 指针有疑问。

如果我创建一个指针,

std::shared_ptr<SomeClass> instance_1;

instance_1this指针也是共享指针吗?

我问这个问题的原因是,如果我使用指针this 在其方法中启动另一个线程。它会复制shared_ptr吗?

【问题讨论】:

标签: c++ multithreading shared-ptr smart-pointers reference-counting


【解决方案1】:

instance_1this指针也是共享指针吗?

没有。 this 指针是指向对象当前实例的指针,在这种情况下,它与共享指针指向同一个共享对象。但它本身不是shared_ptr。它的类型为SomeClass*

我问这个问题的原因是……

要从this 创建shared_ptrSomeClass 必须从std::enable_shared_from_this 派生。然后就可以使用了;

shared_from_this();返回一个shared_ptr,它共享*this的所有权

当在线程之间共享这样的状态时,要小心竞争条件和锁定问题等。

【讨论】:

    【解决方案2】:

    没有。创建指向对象的共享指针不会使对象中的this 成为共享指针。

    如果您想从this 获取共享指针,您可能至少要考虑使用std::enable_shared_from_this

    【讨论】:

      【解决方案3】:

      不,您不能将this 设为共享指针。最接近的是从std::enable_shared_from_this 继承并通过调用获取共享指针:

      this->shared_from_this();
      

      详情可见here

      另一种选择是使用侵入式共享指针,例如boost::intrusive_ptr,其中this 虽然不是共享指针,但可以转换为一个。

      【讨论】:

        【解决方案4】:

        不,this 始终是原始指针。如果你想让另一个线程拥有 shared_ptr 的副本,你必须给它instance_1

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-12
          • 2014-11-30
          • 1970-01-01
          • 2017-08-22
          • 2011-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多