可能的内存泄漏Val ++检测到C ++仍然可以访问

时间:2016-01-28 23:26:28

标签: c++ memory-leaks valgrind stdvector

我怀疑vector clear()函数在调用时是不是可以释放分配的内存。我知道在连接到这些向量的程序中必定存在某种泄漏,因为不存在随着时间增加的内存使用量(当前版本在主循环中2000000次迭代后达到内存使用量的约80%)其中向量不存在的先前实现(先前版本几乎没有达到内存使用的0.2%)。我做了一些研究,发现在调用clear之后内存不一定被解除分配,并且可能的一个技巧是绕过它,即使用交换函数来完成工作。例如:

void clearvecint(vector<int> & vec){
    vec.clear();
    vector<int>().swap(vec);
}

然而,这并没有成功。我也尝试制作矢量全局变量,并应用相同的技术。泄漏仍然存在。最后,我使用了valgrind(我使用了-O0标志),使用了“--leak-check = full --show-leak-kinds = all”参数并获得了以下最终结果:

==28738== LEAK SUMMARY:
==28738==    definitely lost: 0 bytes in 0 blocks
==28738==    indirectly lost: 0 bytes in 0 blocks
==28738==      possibly lost: 0 bytes in 0 blocks
==28738==    still reachable: 167,928 bytes in 590 blocks
==28738==         suppressed: 0 bytes in 0 blocks
==28738== 
==28738== For counts of detected and suppressed errors, rerun with: -v
==28738== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

我也做了一些关于这可能意味着什么的研究并且得出了这个答案:Still Reachable Leak detected by Valgrind。我并不完全确定,但基本上它说的是,将这些泄漏单独留下是没关系的,因为它们仍然可以访问,或者应该留下它们,因为操作系统将在以后清理混乱(即使这很糟糕)实践)。但是,这并不适用于我的情况。我必须要求记忆回来,因为我需要更多的迭代(10000000+)来获得我真正想要的结果,这很可能会导致崩溃。

如果需要,我会很乐意发布更多代码以解决问题。

0 个答案:

没有答案