在我的库中,我使用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对象?
这个概念好吗?
答案 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>()
。但是,这取决于您是否需要获取现有指针的所有权。不过,这本身就是值得修理的事情。
它也是可能的(但不可能从你的问题中得知)你根本不需要共享指针,只能使用独特的指针。