C++ std::shared_ptr指向的对象何时被删除?

C++ std::shared_ptr指向的对象何时被删除?,c++,c++11,shared-ptr,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){ tra

在我的库中,我使用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();
}
如果我调用函数as,我怀疑对象何时会被删除 link.createCobofSometypo新的CobofCob? 当cob对象必须从堆栈中弹出时,使用shared_ptr会阻止删除它吗

这个概念好吗?

从中,当下列情况之一为真时,对象将被删除

拥有该对象的最后一个剩余共享\u ptr将被销毁

拥有该对象的最后剩余共享_ptr通过运算符=或重置被分配另一个指针

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


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

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

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

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

// 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。不过,这取决于您是否需要拥有现有指针。不过,这本身就值得修复


也有可能但不可能从您的问题中判断出您实际上根本不需要共享指针,只需使用唯一指针即可。

所以我可以确定,如果存在指向该对象的共享指针,该对象将永远不会被删除吗?甚至当我在原始指针上调用delete时?@Mihalko:那只是未定义的行为。不要那样做。您只能删除您拥有的内容,一旦共享指针拥有某个内容,您就不拥有它。