【问题标题】:When is object pointed by std::shared_ptr deleted?std::shared_ptr 指向的对象何时被删除?
【发布时间】:2014-05-15 15:51:47
【问题描述】:

在我的库中,我使用 std:shared_ptr`s 来保存我正在使用的通信对象。我有创建这些指针的模板函数。它返回原始指针,因此应用程序可以使用这些对象,而不会产生引用计数的开销(严格的实时应用程序)。

template<typename COBTYPE>
inline COBTYPE* CLink::createCob(COBTYPE cob) {
  std::shared_ptr<CCob> c(cob);

  if(c->init(this)!=OK){
    trace(ERROR,"Cannot add cob, failed to initialize\n");
    return NULL;
  }
  mCobs.push_back(c); //vector of my pointers
  return (COBTYPE*) c.get();
}

我很怀疑,什么时候对象会被删除,如果我调用函数为 link.createCob(new CobOfSomeTypo cob()) ? 当 cob 对象必须从堆栈中弹出时,使用 shared_ptr 会阻止删除它吗?

这个概念好吗?

【问题讨论】:

    标签: c++ c++11 shared-ptr


    【解决方案1】:

    当没有更多共享指针共享所有权时,共享指针共享所有权的对象被删除,例如通常在某个共享指针的析构函数中(但也在赋值中,或在显式重置时)。

    (请注意,可能有许多不同类型的共享指针共享同一个对象的所有权!)


    也就是说,您的代码有问题。也许这样会更好:

    // Requirement: C must be convertible to CCob
    
    template <typename C>
    C * CLink::createCob()
    {
        auto p = std::make_shared<C>();
    
        if (p->init(this) != OK) { return nullptr; }
    
        mCobs.push_back(std::move(p));
    
        return mCobs.back().get();
    }
    

    然后用法将是:link.createCob&lt;CobOfSomeTypo&gt;()。不过,这取决于您是否需要能够取得现有指针的所有权。不过,这本身就是值得修复的。

    也有可能(但不可能从您的问题中看出)您实际上根本不需要共享指针,并且可以简单地使用唯一指针。

    【讨论】:

    • 所以我可以肯定,对象永远不会被删除,如果有任何共享指针,指向它?即使我在原始指针上调用删除?
    • @Mihalko:那只是未定义的行为。不要那样做。你只能delete你拥有的东西,一旦共享指针拥有了东西,就不再拥有它了。
    【解决方案2】:

    来自this reference,当满足以下条件之一时,对象将被删除。

    • 最后一个拥有该对象的 shared_ptr 被销毁。

    • 通过 operator= 或 reset() 为最后一个拥有该对象的 shared_ptr 分配另一个指针。

    关于您的具体情况,当共享指针从堆栈中弹出时,如果这是最后一个引用该对象的指针,那么当弹出的元素超出范围时,该对象将被销毁。

    请注意,如果您提取指向同一对象的原始指针并首先明确地delete 该对象,那么您将调用未定义的行为,因为delete 可能会在同一对象上被调用两次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2012-08-17
      • 2020-11-04
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多