一个弱/共享指针,检测是否还有一个用户,boost
A weak/shared pointer, detect when one user remains, boost
我想要一个指针,我可以告诉何时引用计数为1。本质上,指针的工作方式类似于weak_ptr,但需要手动清理。也就是说,程序每隔一段时间就循环一次指针,检查哪些指针只剩下一个引用。有些可以清洁,有些可以保留一段时间(以防有人再次需要)。
现在,我知道如何使用自定义清理函数和weak_ptr的组合来实现这一点。我只是认为,如果我能简单地弄清楚什么时候shared_ptr只剩下一个用户,那么用更简单的代码就可以完成同样的事情。
我知道shared_ptr有一个use_count
函数,但是它在文档中有这个不祥的注释:"…不一定有效。仅用于调试和测试目的…我当然不太喜欢使用带有这种警告的东西。我其实并不需要计数,只是一种检测何时只剩下一个的方法。
是否有一些boost包装实现我想要的(可以在任何库)?或者我必须使用我已经知道的自定义清理函数与weak_ptr相结合的技术吗?
通常不能准确地确定引用的数量。但是你可以知道什么时候正好是1 -使用unique()
破坏性地将您的shared_ptr
s转换为weak_ptr
s,然后再转换为shared_ptr
s,除了其中一些将为空。当然,没有人知道这对性能有什么影响,但考虑到我们拥有的接口,它要么是use_count
。
可以像
std::for_each(begin, end, [](element_type& pointer)
{
std::weak_ptr<element_type::element_type> weak = element_type(std::move(pointer));
pointer = weak.lock();
});
auto predicate = [](element_type& pointer) { return !pointer; };
container.erase(std::remove_if(begin, end, predicate), end);
当您正在做一些不能用普通shared_ptr系统完全表示的复杂事情时,您可能想要考虑使用intrusive_ptr
来代替—您的intrusive_ptr_release
实现可以将对象排队,以便稍后销毁,而不是立即删除它们。注意,intrusive_ptr
不能直接与weak_ptr
一起使用,不过如果愿意,您可以构造自己的weak_ptr
变体。但是请记住,如果使用多个线程,引用计数可能会变得有点棘手。
如果不能使用侵入性指针,并且在最后一个shared_ptr
丢失时使现有的weak_ptr
无效是可以接受的,则可以使用shared_ptr
的析构函数将原始指针放回标记为最终清理的缓存(或其他)中。您可以在下次检索时将其重新包装在shared_ptr
中。然而,这也有一个缺点,即在伪销毁时刻失去所有的weak_ptr
。
如果你不能使用侵入式指针,你最好设计你自己的智能指针实现。不幸的是,shared_ptr
没有有效实现目标所需的钩子,因此您可能需要从头开始工作。
- C/C++预处理器是否可以检测一些编译器选项
- 如何检测VS C++编译器是否支持C++11?
- 如何检测是否在缓冲绘画动画中绘制最后一帧?
- 用于检测函数类型是否为否的特征
- 错误:在尝试检测 std::cout 是否<< t 时,功能强制转换为数组类型;有效
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 检测是否存在具有 C++17 的类成员
- 如何检测窗口当前是否正在运行模式对话框?
- "configure"脚本如何检测我的系统是否支持某些头文件或 cpp 功能?
- 如何检测类是否有成员变量?
- 如何检测是否例如.T::is_transparent 是定义的?
- 如何检测文件夹是否太重,如果是,请删除其中的一部分
- 检测是否存在具有给定签名的函数
- 检测是否在 QTableWidget 中添加或删除了列
- 如何检测构造函数是否与抛出的析构函数无关
- 如何检测函数是否执行IO操作
- 检测 Visual Studio 项目的属性中是否启用了英特尔 MKL
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 编译器是否检测到错误的共享变量
- c++ /CX是否检测和求解对象的循环?