shared_ptr完全在堆栈上
shared_ptr entirely on stack
假设我知道堆栈帧的寿命将超过shared_ptr
的所有副本,有没有办法创建堆栈对象的shared_ptr
,以便参考计数器也在堆栈上,以便在任何时候都没有动态分配?
例如
SomeObject anObject;
std::shared_ptr::ref_counter refCounter; // Does this exist?
std::shared_ptr<SomeObject>(&anObject, &refCounter, [](SomeObject* obj){
obj->DoSomething();
});
这里的目标是使用shared_ptr
进行引用计数,而不是作为智能指针。
编辑:我将添加更多解释,以使这样做的原因更加清晰。
我正在尝试创建一个令牌,当它及其所有副本被销毁时,我正在编写的线程库调用函数。每个令牌本质上只是一个智能指针的包装器,指向持久对象,该持久对象保存函数并在其析构函数中调用它。复制令牌会复制包装器(从而复制智能指针),但不复制持久对象。
鉴于这些令牌可能会传递给许多不同的线程,持久对象通常需要在堆上,但有时我实际上可以保证特定的堆栈帧将比它创建的任何令牌的所有副本都长寿。在这些情况下,可以在堆栈上创建令牌的持久部分,从而放弃任何昂贵的堆分配。
因此,在某些情况下,智能指针确实需要实际拥有它所指向的对象,但在其他情况下则不需要。
无法使用共享指针管理堆栈分配的对象。
但是,也不需要它。代替共享指针,您可以使用裸指针或引用。由于您知道引用的对象将超过所有用户的寿命,因此它是安全的。
我正在尝试创建一个令牌,该令牌在函数及其所有副本被销毁时调用函数
为此,您不想使用共享指针。您应该只实现自己的引用计数器。
你可以这样做,但这不是一个好的选择*。
SomeObject anObject;
std::shared_ptr<SomeObject>(&anObject, [](auto x){}});
科里鲁示例
*这不使用shared_ptr
的大部分功能,是一种浪费,计数可以通过许多其他方式记录,包括实现您自己的计数类。
我真的认为没有理由阻止动态分配。即使您不能使用堆,动态分配也可以完全在堆栈上进行。
相关文章:
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- CLANG 编译器 说:变量"PTR"可能未初始化
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- Linux中的c++运行时错误::glibc检测到free():无效的下一个大小(快速):堆栈具有void ptr元素
- 将ptr返回到堆栈缓冲区