在我的图书馆中,我使用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();
}


我怀疑,如果我将function称为
link.createCob(new CobOfSomeTypo 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>()。但是,这取决于您是否需要拥有现有指针的所有权。不过,这本身就值得解决。

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

关于c++ - 什么时候删除了std::shared_ptr指向的对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23671945/

10-11 22:48
查看更多