【发布时间】:2017-10-18 13:27:04
【问题描述】:
假设我知道堆栈帧将比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 进行引用计数,而不是作为智能指针。
编辑:我将添加更多解释,以便更清楚地说明这样做的原因。
我正在尝试创建一个令牌,该令牌在函数及其所有副本都为我正在编写的线程库销毁时调用函数。每个令牌本质上只是一个智能指针的包装器,该指针指向一个持久对象,该对象保存函数并在其析构函数中调用它。复制令牌会复制包装器(以及智能指针),但不会复制持久对象。
鉴于这些令牌可能会传递给许多不同的线程,因此持久对象通常需要在堆上,但有时我可以保证特定堆栈帧的寿命将超过它创建的任何令牌的所有副本。在这些情况下,可以在堆栈上创建令牌的持久部分,从而放弃任何昂贵的堆分配。
所以在某些情况下,智能指针确实需要真正拥有它所指向的对象,但在其他情况下则不需要。
【问题讨论】:
-
AFAIK 这是不可能的。
-
您是否尝试将对象保留在堆栈上?或者你需要参考计数?
-
还有什么理由不能使用动态分配? (实际上,如果您不想使用堆,您的分配器可以使用堆栈内存。)
-
您可以使用 std::array 或其他方式在堆栈上分配一些空间,编写一个自定义分配器,该分配器将从该预分配的内存块中分配空间并使用
allocate_shared。唯一的问题是您无法(可移植地)知道要预分配的内存量 - 无法知道 shared_ptr 控制块的大小,也无法按需分配(可移植地)额外的堆栈空间。 -
引用计数实际上是一个
int递增/递减。更改为atomic_int以确保线程安全。到底发生了什么,需要如此滥用shared_ptr
标签: c++ c++11 shared-ptr smart-pointers