首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost shared_ptr不会立即销毁对象

Boost shared_ptr不会立即销毁对象
EN

Stack Overflow用户
提问于 2013-01-22 17:24:33
回答 3查看 995关注 0票数 0

我正在用C++开发一个贝叶斯推理采样器,它在很大程度上依赖于一棵树,这棵树是在智能指针(Boost的shared_ptr和weak_ptr)的帮助下实现的。

在推理过程中(例如,运行一个长C++函数1-2分钟),树发生了很大的变化,创建和销毁了许多节点。

推理过程完全(100%负载)占用处理器(更准确地说,是它的线程)。由于某些原因,新内存(用于新节点)正在被占用,但旧内存并未完全释放,这会在推理1-2分钟后导致内存溢出。

然而,如果我在推理过程中添加暂停,似乎程序完全销毁了旧对象,并且一切正常。

对我来说,原因似乎是析构函数(或者,更准确地说,在它之后发生的事情,即内存释放)由于某种原因而被延迟。

你能告诉我: 1)这似乎是一个真正的问题吗? 2)如果是,在“足够的内存”将被释放的时候,如何等待更好?什么是标准策略?

(该程序在Unix上运行。)

EN

回答 3

Stack Overflow用户

发布于 2013-01-22 17:37:47

您观察到的内存问题似乎并不存在于C++本身。如果shared_ptr释放了它的内存,它会立即释放,而不是以某种延迟的方式。但是,您的操作系统可能会在它认为合适的时候延迟“真正”发布一段时间。在像Windows的“任务管理器”这样的程序中,你的程序似乎消耗了越来越多的内存,而这只是操作系统为你保留的内存,而你实际上并没有占用。如果您的计算产生了如此沉重的处理器负载,调度器可能会延迟相当“不重要”的任务(如释放内存),直到有时间,以避免妨碍更重要的事情,如您的计算。

但是,释放和分配内存的开销很大。看起来你可以交替地释放和分配大量的内存。您应该考虑回收该内存,要么进行自己的内存管理(如内存池等),要么回收对象(即节点)本身,这意味着不是真的销毁它们,而是将它们返回到某个“节点池”,并用新的值重新设置它们。这两种方法都可以与shared_ptr结合使用。

票数 2
EN

Stack Overflow用户

发布于 2013-01-22 17:46:06

听起来你的树中有循环,也就是说,它同时对子指针和父指针使用shared_ptr,这可以防止自动销毁树节点。使用普通指针可能会更好。

票数 1
EN

Stack Overflow用户

发布于 2013-01-22 17:32:30

当指向某个对象的最后一个shared_ptr被销毁时,该对象将被立即删除。所以你得到的东西听起来很奇怪。我唯一能想到的就是你已经在你的实现中附加了一个垃圾收集器……否则,请仔细检查所有旧对象是否都已销毁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14455201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档