C++ 弱/共享指针,当一个用户保留时检测,boost
我想要一个指针,我可以告诉什么时候引用计数是一。从本质上讲,指针的工作方式类似于弱ptr,但需要手动进行清理。也就是说,每隔一段时间,程序就会遍历指针循环,并检查哪些指针只剩下一个引用。有些可以清洗,有些可以保留更长的时间(以防有人再次需要) 现在,我知道了如何结合使用自定义清理功能和弱ptr来实现这一点。我只是认为,如果我能简单地计算出共享的ptr何时只剩下一个用户,同样的事情也可以通过更简单的代码实现 我知道shared_ptr有一个C++ 弱/共享指针,当一个用户保留时检测,boost,c++,boost,shared-ptr,weak-references,C++,Boost,Shared Ptr,Weak References,我想要一个指针,我可以告诉什么时候引用计数是一。从本质上讲,指针的工作方式类似于弱ptr,但需要手动进行清理。也就是说,每隔一段时间,程序就会遍历指针循环,并检查哪些指针只剩下一个引用。有些可以清洗,有些可以保留更长的时间(以防有人再次需要) 现在,我知道了如何结合使用自定义清理功能和弱ptr来实现这一点。我只是认为,如果我能简单地计算出共享的ptr何时只剩下一个用户,同样的事情也可以通过更简单的代码实现 我知道shared_ptr有一个use_count功能,但文档中有这样一个不祥的提示:“…
use_count
功能,但文档中有这样一个不祥的提示:“……不一定有效。仅用于调试和测试目的……”当然,我不太喜欢使用带有这样警告的东西。我其实并不需要计数,只是一种检测何时只剩下一个的方法
是否有一些boost包装器可以实现我想要的(可以在任何库中)?或者我必须使用我已经知道的自定义清理功能与弱\u ptr相结合的技术吗?当你在做一些无法用普通共享\u ptr系统表示的复杂事情时,相反,您可能想考虑使用--<代码> > IssisivipTrpReloest可以将对象排队等待以后的销毁,而不是立即删除它们。请注意,
intrusive_ptr
不能直接与弱_ptr
一起使用,尽管如果愿意,您可以构建自己的弱_ptr
变体。但是,请记住,如果使用多个线程,那么引用计数可能会变得有点棘手
如果您不能使用侵入式指针,并且当最后一个共享的\u ptr
丢失时,可以使现有的弱的\u ptr
无效,那么您可以让共享的\u ptr
的析构函数将原始指针放回缓存(或任何标记),以进行最终清理。下次检索时,您可以在共享\u ptr
中对其进行重写。然而,同样,这也有一个缺点,即在伪破坏的时刻,对象会丢失所有的弱ptr
s
如果不能使用侵入式指针,那么最好只设计自己的智能指针实现。不幸的是,
shared\u ptr
没有有效实现目标所需的钩子,因此您可能是从头开始工作。当您在做一些无法用普通shared\u ptr系统表示的复杂事情时,相反,您可能想考虑使用--<代码> > IssisivipTrpReloest可以将对象排队等待以后的销毁,而不是立即删除它们。请注意,intrusive_ptr
不能直接与弱_ptr
一起使用,尽管如果愿意,您可以构建自己的弱_ptr
变体。但是,请记住,如果使用多个线程,那么引用计数可能会变得有点棘手
如果您不能使用侵入式指针,并且当最后一个共享的\u ptr
丢失时,可以使现有的弱的\u ptr
无效,那么您可以让共享的\u ptr
的析构函数将原始指针放回缓存(或任何标记),以进行最终清理。下次检索时,您可以在共享\u ptr
中对其进行重写。然而,同样,这也有一个缺点,即在伪破坏的时刻,对象会丢失所有的弱ptr
s
如果不能使用侵入式指针,那么最好只设计自己的智能指针实现。不幸的是,
shared\u ptr
没有有效实现目标所需的挂钩,因此您可能是从头开始工作。破坏性地将您的shared\u ptr
s转换为弱\u ptr
s,然后再转换回shared\u ptr
s,除非其中一些是空的。当然,没有人知道这对性能有什么影响,但是考虑到我们的界面,它要么是那样,要么是使用\u 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);
std::for_each(开始、结束、[](元素类型和指针)
{
std::weak_ptr弱=元素类型(std::move(指针));
指针=弱.lock();
});
自动谓词=[](元素类型和指针){return!pointer;};
容器.erase(std::remove_if(begin、end、predicate)、end);
将您的共享ptr
s破坏性地转换为弱ptr
s,然后再转换回共享ptr
s,但其中一些将为空。当然,没有人知道这对性能有什么影响,但是考虑到我们的界面,它要么是那样,要么是使用\u 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);
std::for_each(开始、结束、[](元素类型和指针)
{
std::weak_ptr弱=元素类型(std::move(指针));
指针=弱.lock();
});
自动谓词=[](元素类型和指针){return!pointer;};
容器.erase(std::remove_if(begin、end、predicate)、end);
通常,您无法准确确定引用的数量。但是你可以知道什么时候它是唯一的-使用unique()
你通常不能准确地确定引用的数量。但是你可以知道什么时候它正好是一个-使用unique()
引用计数为一有什么神奇之处?当一个客户端可能仍在保留一个对象时,为什么您可能要“清理”该对象,这不会给客户端带来问题吗?听起来您在做某种缓存管理器…?@CharlesBailey,正如bdonlan所说,它是一种缓存管理器。剩余1的意义在于,剩余的唯一副本是缓存本身中的副本。那么,缓存是否不可能保存weak_ptr
s?@edA-qamart-ora-y:如果剩余的一个引用是t