当std::shared_ptr所指向的对象被删除

When is object pointed by std::shared_ptr deleted?

本文关键字:对象 删除 std shared ptr      更新时间:2023-10-16

在我的库中,我使用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 initializen");
    return NULL;
  }
  mCobs.push_back(c); //vector of my pointers
  return (COBTYPE*) c.get();
}

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

这个概念好吗?

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

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


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

// 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<CobOfSomeTypo>()。不过,这取决于您是否需要能够获取现有指针的所有权。不过,这本身就值得修复。

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

从这个引用中,当下列条件之一为真时,对象将被删除。

  • 最后剩余的shared_ptr对象被销毁。

  • 最后剩余的shared_ptr指针通过operator=或reset()分配给另一个指针。

根据您的具体情况,当共享指针从堆栈中弹出时,如果这是引用对象的最后一个指针,则当弹出的元素超出作用域时,对象将被销毁。

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