当std::shared_ptr所指向的对象被删除
When is object pointed by std::shared_ptr deleted?
在我的库中,我使用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 initializen");
return NULL;
}
mCobs.push_back(c); //vector of my pointers
return (COBTYPE*) c.get();
}
我在怀疑,当对象将被删除,如果我调用函数为link.createCob(new CobOfSomeTypo cob())
吗?当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>()
。不过,这取决于您是否需要能够获取现有指针的所有权。不过,这本身就值得修复。
也有可能(但不可能从你的问题中看出),你实际上根本不需要共享指针,而可以简单地使用唯一指针。
从这个引用中,当下列条件之一为真时,对象将被删除。
-
最后剩余的shared_ptr对象被销毁。
-
最后剩余的shared_ptr指针通过operator=或reset()分配给另一个指针。
根据您的具体情况,当共享指针从堆栈中弹出时,如果这是引用对象的最后一个指针,则当弹出的元素超出作用域时,对象将被销毁。
请注意,如果您提取一个指向同一对象的原始指针并首先显式地delete
对象,那么您将调用未定义行为,因为delete
可能在同一对象上被调用两次。
相关文章:
- 线程调用的函数对对象删除是否安全?
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 使用 com 对象删除计划任务
- C 将对象删除为参考
- C样式对象删除的包装器
- 静态映射中动态分配的对象.删除必要的
- C++指向对象删除的指针数组,"Debug assertion failure!"
- 在其成员函数返回之前,将对象删除是不确定的行为吗?
- Python 对象删除检测
- C++安全对象删除
- Qt:RemoveWidget和对象删除
- Qt对象删除导致崩溃
- 删除由两个shared_pointer实例管理的对象(删除其中一个)
- 顶点缓冲区对象(删除进程)opengl
- 设计 -- 按名称或对象删除
- 提升中的异常:进程间,共享内存对象删除
- 使用std::function和std::bind来存储回调并处理对象删除
- 如何使用智能指针防止双重对象删除
- 指针指向对象删除时自动为空
- 对象层次结构中的对象删除责任