【发布时间】:2013-01-22 09:24:33
【问题描述】:
我正在用 C++ 开发一个贝叶斯推理采样器,它在树上传递很多信息,而这棵树是在智能指针(Boost 的 shared_ptr 和 weak_ptr)的帮助下实现的。
在推理过程中(即运行一个较长的 C++ 函数 1-2 分钟),树发生了很大变化,创建和销毁了许多节点。
推理过程完全(100% 负载)占用处理器(一个线程,更准确地说)。由于某种原因,新内存(用于新节点)被占用,但旧内存没有被完全释放,这会在 1-2 分钟的推理后导致内存溢出。
不过,如果我在推理过程中添加暂停,似乎程序会完全破坏旧对象,并且一切正常。
在我看来,原因是析构函数(或者更准确地说,它之后发生的事情,即内存释放)由于某种原因被延迟了。
请告诉我: 1)这似乎是一个真正的问题? 2)如果是,最好等待“足够的内存”被释放?什么是标准策略?
(程序正在Unix上运行。)
【问题讨论】:
-
对我来说,听起来您的 shared_ptr 仍然有对它们的引用,因此不会被直接销毁。但老实说,没有任何代码很难说。
-
shared_ptr只是调用delete。您确定观察到的行为不是由于delete造成的吗?因为已知delete实现会推迟实际解除操作,假设它们可以回收分配。 -
MSalters,您能否提供有关延迟释放的删除实现的参考信息?我认为这可能正是我的情况。 (对不起,还没找到自己。)
-
你有没有试过在类析构函数中添加一个 printf 来记录它被调用的时候?这样你就知道它是否被破坏了。
标签: c++ boost destructor shared-ptr smart-pointers