我正在C++中开发贝叶斯推理采样器,它在树上中继很多,并且这个树是在智能指针(Boost的shared_ptr和weak_ptr)的帮助下实现的。Boost shared_ptr不会立即销毁对象
在推断过程中(即运行一个长时间的C++函数1-2分钟),树被改变很多,创建并销毁了许多节点。
完全推理过程(100%负载)占用处理器(更精确地说,它是一个线程)。出于某种原因,新内存(对于新节点)正在被占用,但旧内存不会被完全释放,这会在内存溢出1-2分钟后导致内存溢出。
虽然,如果我在推理过程中添加暂停,程序似乎完全销毁旧对象,并且一切正常。
在我看来,原因是析构函数(或者更准确地说,它后面发生的事情,即内存释放)由于某种原因而被延迟。
请问:请问: 1)这看起来是一个真正的问题吗? 2)如果是,那么等待“足够的内存”被释放时如何更好?什么是标准策略?
(该程序正在被在Unix上运行。)
对我来说,听起来像你的shared_ptr仍然有引用持有给他们,因此不会被直接销毁。但说实话,很难说没有任何代码。 –
'shared_ptr'只是调用'delete'。你确定观察到的行为不是由于“删除”?因为'删除'实现是已知的,它推迟了实际的处理,假设他们可以回收分配。 – MSalters
MSalters,你可以给出一个关于删除实现的信息,并推迟释放吗?我认为这可能是我的情况。 (对不起,还没有找到我自己。) –