Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何调试高内存消耗_C++_Debugging_Opencv_Memory - Fatal编程技术网

C++ 如何调试高内存消耗

C++ 如何调试高内存消耗,c++,debugging,opencv,memory,C++,Debugging,Opencv,Memory,我编写了一个程序,使用OpenCV持久化模块读取.xml.gz文件。我使用一个类来管理这些数据。在构造函数中,它使用cv::FileStorage读取所有数据。所有数据都在成员变量中,这些变量是std::vector或cv::Mat。类的每个实例之间不存在静态成员或共享的任何内容 奇怪的是。如果我只使用类的一个实例,程序将消耗大约50MB的内存。但是,如果我使用两个实例,它将消耗大约600MB。如果我使用三个,它将消耗大约650MB。如果我使用四个,它将消耗大约700MB。。。似乎只有一个实例和

我编写了一个程序,使用OpenCV持久化模块读取.xml.gz文件。我使用一个类来管理这些数据。在构造函数中,它使用
cv::FileStorage
读取所有数据。所有数据都在成员变量中,这些变量是
std::vector
cv::Mat
。类的每个实例之间不存在静态成员或共享的任何内容

奇怪的是。如果我只使用类的一个实例,程序将消耗大约50MB的内存。但是,如果我使用两个实例,它将消耗大约600MB。如果我使用三个,它将消耗大约650MB。如果我使用四个,它将消耗大约700MB。。。似乎只有一个实例和多个实例之间有一条奇怪的界线

我做了一些实验,下面是一些结果:

  • 这个问题只发生在Linux(Ubuntu 14.04,OpenCV 3.0)上,而不是Windows上
  • 我使用valgrind进行检查,程序中没有内存泄漏
  • 以下是该类的代码:

    指出我代码中的问题或给我一些调试此类问题的建议都会非常有帮助

    编辑:
    我遵循评论中的建议,使用top-p而不是gnome系统监视器来检查内存消耗。结果是: VIRT:1003552,RES:693228,SHR:8440,%MEM:33.8(这台计算机总共有2GB内存)

    编辑2:
    我使用tcmalloc替换g++的内存分配器,然后问题神秘地消失了。

    您可以链接到tcmalloc(一个内存分配库,它将替换程序中常用的内存分配例程)并使用它的堆分析器。堆分析器将告诉您内存消耗的来源(即程序中的哪些函数正在分配所有内存)。这将为进一步调试提供一个良好的起点。

    如何测量内存消耗?调试的一个建议是编写一个内存查询类,为您提供PSS、RES或VIRT内存。在每个块之后,您可以使用这个查询类的对象,并查看内存增加。GNOME-Stor系统中的C++中的LIB不会因为性能原因而将内存释放回OS。@ SysHyLasasi在我只使用一个实例时,内存消耗将暂时增加到大约600 MB,但最终会降低到50MB。因此,我认为OpenCV使用这些内存来解析xml文件。但为什么我在实例上使用时它会返回内存,而在我使用多个实例时它不会返回内存~~如果内存分配可能发生在第三方库中,它会工作吗?在我的情况下,内存可能是由OpenCV分配的。@Delphi首先是的,除非他们使用自己的内存分配器(这不太可能)。@Aaronl我按照你的建议,使用了tcmalloc,然后神秘的事情发生了:问题消失了。。。