一个弱/共享指针,检测是否还有一个用户,boost

A weak/shared pointer, detect when one user remains, boost

本文关键字:是否 检测 有一个 boost 用户 指针 共享 一个      更新时间:2023-10-16

我想要一个指针,我可以告诉何时引用计数为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没有有效实现目标所需的钩子,因此您可能需要从头开始工作。