我怀疑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+)来获得我真正想要的结果,这很可能会导致崩溃。
如果需要,我会很乐意发布更多代码以解决问题。