C++ 使用valgrind时,内存泄漏消失

C++ 使用valgrind时,内存泄漏消失,c++,valgrind,C++,Valgrind,我们有一个复杂的算法,它处理OpenCV图像,从而分配和释放几GB的内存,大部分是cv::Mat,每个大小约为10MB。如果我们使用--tool=massif或--tool=memcheck以迭代方式运行这个函数,那么每次迭代后内存占用都会返回到相同的值(+-1MB),并且没有发现明显的内存泄漏。通过ps或pmap从外部或通过/proc/self/status从内部观看,也显示了2.3GB的最大占用空间,但没有增加 但是,如果我们在没有valgrind的情况下运行相同的软件,那么内存占用(通过p

我们有一个复杂的算法,它处理OpenCV图像,从而分配和释放几GB的内存,大部分是cv::Mat,每个大小约为10MB。如果我们使用--tool=massif或--tool=memcheck以迭代方式运行这个函数,那么每次迭代后内存占用都会返回到相同的值(+-1MB),并且没有发现明显的内存泄漏。通过ps或pmap从外部或通过/proc/self/status从内部观看,也显示了2.3GB的最大占用空间,但没有增加

但是,如果我们在没有valgrind的情况下运行相同的软件,那么内存占用(通过ps或pmap从外部检查,或通过/proc/self/status从内部检查)会随着每次迭代而增加,大约数百MB,在几次迭代后很快达到5BG

因此,我们有一些东西看起来像是内存泄漏,但valgrind对查找原因没有帮助。 这会是什么


(这是Ubuntu下的C++)。

< P>由于@ PHD的注释,我找到了解决问题的方法:使用TCMOLLC显著地减少内存占用(使用2.5GB而不是6GB)。见附页

使用tcmalloc或jemalloc时,内存使用似乎仍略有增加,但至少对于我们通常使用的迭代次数来说,这是可以的


仍然想知道malloc怎么会浪费这么多资源。我试图用malloc_info()找到答案,但没有成功。我怀疑内存碎片和/或多线程在这里起作用。

随着堆空间的增长,程序会从操作系统请求页面。当内存返回到堆时,堆不会将页面返回到操作系统。相反,它使用这些页面来满足后续的内存请求。@Eljay不应该增长,但如果每次迭代都清理资源,您是否使用OpenCV中的CUDA?不使用CUDAhere@Sopel•正确,与之相配合的是:通过ps或pmap从外部观看,或通过/proc/self/status从内部观看,也显示了2.3GB的最大占用空间,但没有增加。