在我的图书馆中,我使用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/