我想要一个指针,我可以判断引用计数是1。本质上,指针的工作方式类似于weak_ptr,但清理工作需要手动完成。也就是说,程序经常会经历一个指针循环并检查哪些程序只剩下一个引用。有些它会清洁,有些则会保留一段时间(如果有人再需要它)。
现在,我知道如何使用自定义清理功能和weak_ptr的组合来完成此操作。我只是认为可以用更简单的代码完成同样的事情,如果我能够简单地弄清楚何时只剩下shared_ptr的一个用户。
我知道shared_ptr有一个use_count
函数,但它在文档中有这个不祥的注释:“......不一定有效。仅用于调试和测试......”当然,我并不热衷于使用带有这种警告的东西。无论如何,我真的不需要计数,只是一种方法来检测何时只剩下一个。
是否有一些可以实现我想要的增强包装器(可以在任何库中)?或者我必须使用我已经知道的自定义清理功能与weak_ptr结合的技术吗?
答案 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
没有实现目标所需的钩子,所以你可能从头开始工作。