Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 弱/共享指针,当一个用户保留时检测,boost_C++_Boost_Shared Ptr_Weak References - Fatal编程技术网

C++ 弱/共享指针,当一个用户保留时检测,boost

C++ 弱/共享指针,当一个用户保留时检测,boost,c++,boost,shared-ptr,weak-references,C++,Boost,Shared Ptr,Weak References,我想要一个指针,我可以告诉什么时候引用计数是一。从本质上讲,指针的工作方式类似于弱ptr,但需要手动进行清理。也就是说,每隔一段时间,程序就会遍历指针循环,并检查哪些指针只剩下一个引用。有些可以清洗,有些可以保留更长的时间(以防有人再次需要) 现在,我知道了如何结合使用自定义清理功能和弱ptr来实现这一点。我只是认为,如果我能简单地计算出共享的ptr何时只剩下一个用户,同样的事情也可以通过更简单的代码实现 我知道shared_ptr有一个use_count功能,但文档中有这样一个不祥的提示:“…

我想要一个指针,我可以告诉什么时候引用计数是一。从本质上讲,指针的工作方式类似于弱ptr,但需要手动进行清理。也就是说,每隔一段时间,程序就会遍历指针循环,并检查哪些指针只剩下一个引用。有些可以清洗,有些可以保留更长的时间(以防有人再次需要)

现在,我知道了如何结合使用自定义清理功能和弱ptr来实现这一点。我只是认为,如果我能简单地计算出共享的ptr何时只剩下一个用户,同样的事情也可以通过更简单的代码实现

我知道shared_ptr有一个
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