Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++_Memory - Fatal编程技术网

C++ 程序似乎泄漏内存,但未检测到内存泄漏

C++ 程序似乎泄漏内存,但未检测到内存泄漏,c++,memory,C++,Memory,我目前正在开发一个程序,该程序有一些内存泄漏,我通过编写一个名为memory的类,将其合并为所有其他类的基类,并将分配和取消分配函数写入memory类来修复这些漏洞。每次分配或取消分配内存时,详细信息(包括发出调用的类和函数)都将记录到一个向量中。这使我能够编写算法来分析结果,并指出程序中内存泄漏的方向 我终于到了分析没有发现程序泄漏的地步(所有记录的分配都有匹配的取消分配)。但是,当我使用预处理器宏禁用内存功能时(以确保内存没有被向量耗尽),我仍然可以找到内存泄漏的原因。我通过在循环中运行测试

我目前正在开发一个程序,该程序有一些内存泄漏,我通过编写一个名为
memory
的类,将其合并为所有其他类的基类,并将分配和取消分配函数写入
memory
类来修复这些漏洞。每次分配或取消分配内存时,详细信息(包括发出调用的类和函数)都将记录到一个向量中。这使我能够编写算法来分析结果,并指出程序中内存泄漏的方向

我终于到了分析没有发现程序泄漏的地步(所有记录的分配都有匹配的取消分配)。但是,当我使用预处理器宏禁用
内存
功能时(以确保内存没有被向量耗尽),我仍然可以找到内存泄漏的原因。我通过在循环中运行测试函数并观察任务管理器来实现这一点:内存使用稳步增加,尽管“内存管理”向量不起作用,并且测试在活动时不返回任何结果

通过解决方案范围内的搜索,我已确保除了内存管理功能外,从未使用关键字
new
。当调试被停用时,所有这些函数的作用都是分配一块新内存并返回地址,就像我直接使用了
new
关键字一样

我真的想知道是否有某种C++异常会导致程序消耗内存,或者如果它只是我的调试算法中的一个问题,它会导致它漏掉一个漏洞。如有必要,我可以发布代码;这有点冗长乏味,但我可以尝试在更小的范围内重新创建问题-请告诉我


提前感谢您的建议,我知道没有代码就没有什么可以做的了——我只是在寻找可能导致这种情况的语言中的任何怪癖,而不是寻找代码中的漏洞。同样,我很乐意在必要时发布代码

还有其他泄漏内存的方法,例如GDI不对自己分配的资源调用DeleteObject

如果您在windows上使用Visual Studio,则可以使用CRT的内置内存泄漏检测功能:
还有其他泄漏内存的方法,例如GDI不调用自己分配的资源上的DeleteObject

如果您在windows上使用Visual Studio,则可以使用CRT的内置内存泄漏检测功能:

一个单词-
valgrind
。长版本:你不需要重新发明轮子,
valgrind
已经实施了多年,这是一个了不起的工具,它为你提供了大量的信息,99.99%的时间是正确的,足够详细。还有,是什么让你觉得有漏洞?如果exe的内存使用量在增长——这是正常的,大多数情况下,一旦某个内存被用于某个进程,它就不会返回到操作系统(以便以后更容易、更快地检索,如果需要的话)。我不得不同意你的看法,但我在尝试让Valgrind工作之前已经花了大约一周的时间,但没有用。你知道一个可靠的Valgrind windows发行版吗?你的“内存管理功能”是否与容器分配器正确交互?稳步增加的内存使用率可能意味着你的程序正在稳步使用更多的内存而没有任何泄漏。@BradSullivan-哦,windows。。我明白问题所在。没办法,应该有办法在Windows中运行它,但我从未尝试过。一个词-
valgrind
。长版本:你不需要重新发明轮子,
valgrind
已经实施了多年,这是一个了不起的工具,它为你提供了大量的信息,99.99%的时间是正确的,足够详细。还有,是什么让你觉得有漏洞?如果exe的内存使用量在增长——这是正常的,大多数情况下,一旦某个内存被用于某个进程,它就不会返回到操作系统(以便以后更容易、更快地检索,如果需要的话)。我不得不同意你的看法,但我在尝试让Valgrind工作之前已经花了大约一周的时间,但没有用。你知道一个可靠的Valgrind windows发行版吗?你的“内存管理功能”是否与容器分配器正确交互?稳步增加的内存使用率可能意味着你的程序正在稳步使用更多的内存而没有任何泄漏。@BradSullivan-哦,windows。。我明白问题所在。没办法,应该有办法在Windows中运行它,但我从未尝试过。我使用了交叉引用的CRT工具。这并不漂亮,但肯定很管用。使用
\u CrtSetBreakAlloc(…)
是一种非常有效的方法,可以让您在泄漏中进入有问题的分配。我正在使用CLion,但为了获得更好的调试功能,我已经将代码移到了Visual Studio。我试试看——谢谢!如果您在visual studio编译器中使用CLion,您可以坚持使用CLion,因为这是运行时的功能,而不是IDE的功能。这并不漂亮,但肯定很管用。使用
\u CrtSetBreakAlloc(…)
是一种非常有效的方法,可以让您在泄漏中进入有问题的分配。我正在使用CLion,但为了获得更好的调试功能,我已经将代码移到了Visual Studio。我试试看——谢谢!如果在VisualStudio编译器中使用CLion,则可以坚持使用CLion,因为这是运行时的特性,而不是IDE的特性。