什么时候std :: shared_ptr指向的对象被删除?

时间:2014-05-15 07:34:13

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

在我的库中,我使用std:shared_ptr来保存通信对象,我正在使用。我有模板功能创建这些指针。它返回原始指针,因此应用程序可以使用这些对象,而无需引用计数(严格的实时应用程序)。

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())? 使用shared_ptr是否会在必须从堆栈中弹出时阻止删除cob对象?

这个概念好吗?

2 个答案:

答案 0 :(得分:4)

this reference开始,如果满足下列条件之一,则删除该对象。

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

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

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

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

答案 1 :(得分:3)

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

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


那就是说,你的代码有问题。也许它可能会更好:

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

它也是可能的(但不可能从你的问题中得知)你根本不需要共享指针,只能使用独特的指针。