繁体   English   中英

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){}});

coliru的例子


*这不使用shared_ptr大多数功能而且是浪费,并且可以通过许多其他方式记录计数,包括实现您自己的计数类。


我真的认为没有理由阻止动态分配。 即使您不能使用堆,动态分配也可以在堆栈上完全发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM