弱/共享指针,检测一个用户何时保持,提升

时间:2011-09-25 07:00:49

标签: c++ boost shared-ptr weak-references

我想要一个指针,我可以判断引用计数是1。本质上,指针的工作方式类似于weak_ptr,但清理工作需要手动完成。也就是说,程序经常会经历一个指针循环并检查哪些程序只剩下一个引用。有些它会清洁,有些则会保留一段时间(如果有人再需要它)。

现在,我知道如何使用自定义清理功能和weak_ptr的组合来完成此操作。我只是认为可以用更简单的代码完成同样的事情,如果我能够简单地弄清楚何时只剩下shared_ptr的一个用户。

我知道shared_ptr有一个use_count函数,但它在文档中有这个不祥的注释:“......不一定有效。仅用于调试和测试......”当然,我并不热衷于使用带有这种警告的东西。无论如何,我真的不需要计数,只是一种方法来检测何时只剩下一个。

是否有一些可以实现我想要的增强包装器(可以在任何库中)?或者我必须使用我已经知道的自定义清理功能与weak_ptr结合的技术吗?

3 个答案:

答案 0 :(得分:2)

您通常无法准确确定引用数量。但你可以告诉它何时只是一个 - 使用unique()

答案 1 :(得分:1)

破坏性地将您的shared_ptr转换为weak_ptr,然后再转换回shared_ptr,除了其中一些将为空。当然,没有人知道性能如何,但鉴于我们拥有的界面或者是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);

答案 2 :(得分:0)

当您正在执行一些无法用普通shared_ptr系统表示的复杂事物时,您可能需要考虑使用intrusive_ptr - 您的intrusive_ptr_release实现可以将对象排队等待以后破坏而不是立即删除它们。请注意intrusive_ptr无法直接与weak_ptr一起使用,但如果您愿意,可以构建自己的weak_ptr变体。但请记住,如果您使用多个线程,引用计数可能会有点棘手。

如果您不能使用侵入式指针,并且在最后weak_ptr丢失时使现有shared_ptr无效是可以接受的,那么您可以让shared_ptr的析构函数放入 raw 指针返回标记为最终清理的缓存(或其他)。您可以在下次检索时将其重新包装在shared_ptr中。然而,再次,这具有在伪破坏时丢失所有weak_ptr对象的缺点。

如果您不能使用侵入式指针,那么您最好只设计自己的智能指针实现。不幸的是,shared_ptr没有实现目标所需的钩子,所以你可能从头开始工作。