在没有任何内存泄漏的情况下,增加代码的内存使用率是否可能? 有一个C++代码,它在循环迭代中进行一些计算。当我运行代码几个小时时,内存使用率没有明显增加。但当我让它在夜间运行时,MS Performance Monitor工具(perfmon.exe)观察到内存使用量增加了50 MB,如下所示。绘图仅用于我的流程,而不是整个系统

在没有任何内存泄漏的情况下,增加代码的内存使用率是否可能? 有一个C++代码,它在循环迭代中进行一些计算。当我运行代码几个小时时,内存使用率没有明显增加。但当我让它在夜间运行时,MS Performance Monitor工具(perfmon.exe)观察到内存使用量增加了50 MB,如下所示。绘图仅用于我的流程,而不是整个系统,c++,memory,memory-management,memory-leaks,C++,Memory,Memory Management,Memory Leaks,无法在实现的循环中检测到任何内存泄漏。内存使用量增加的原因可能不是内存泄漏吗?可视泄漏检测器可能会被看似合法但实际上不合法的内存使用模式所愚弄。例如,如果您一直在分配某些内容,而不仅忘记释放它们,而且还将指向它们的指针保留在列表中,那么就任何愚蠢的工具而言,这看起来都是正常的内存使用 此外,50MB的内存对于桌面应用程序来说并不是那么大,而且在任何情况下,您的观察都太有限,无法得出任何结论。这可能是C++运行时的内存管理器认为这些50MB的花生值得牺牲,因此可能会选择不麻烦合并相邻的空闲块,以满


无法在实现的循环中检测到任何内存泄漏。内存使用量增加的原因可能不是内存泄漏吗?

可视泄漏检测器可能会被看似合法但实际上不合法的内存使用模式所愚弄。例如,如果您一直在分配某些内容,而不仅忘记释放它们,而且还将指向它们的指针保留在列表中,那么就任何愚蠢的工具而言,这看起来都是正常的内存使用


此外,50MB的内存对于桌面应用程序来说并不是那么大,而且在任何情况下,您的观察都太有限,无法得出任何结论。这可能是C++运行时的内存管理器认为这些50MB的花生值得牺牲,因此可能会选择不麻烦合并相邻的空闲块,以满足分配请求时,有更多的新OS内存可用。为了更好地对正在发生的事情进行理论分析,您需要向我们展示一个更完整的应用程序内存分配图。这是一个连续的直坡吗?它是一个斜坡,在某个点变成了一条平直线吗?有没有突然的楼梯?是否在物理内存耗尽并开始分页后,坡度仍在不断上升?

是;这是可能的。您可能有正在增长的列表或其他数据结构-您没有删除项目,因此列表会不断增长。内存泄漏的可能性较小,因为在泄漏的项目之间存在循环引用,因此泄漏检测器不会发现有泄漏。我看到两种可能性:要么VLD遗漏了内存泄漏(这实际上可能发生),要么代码实际增加了内存使用量(这并不需要内存泄漏,当您不能再引用某些内存,因此无法释放它时,就会发生内存泄漏,但您也可以在程序运行时保留更多内存)。此信息是专门针对您的程序还是整个系统的?如果是系统图,则可能正在运行其他使用更多内存的任务或程序。让应用程序继续运行。如果内存泄漏(或数据结构不断扩展),您将看到应用程序的内存使用量继续无限增长,直到最终应用程序崩溃或整个计算机崩溃(现在更可能是前者)。如果没有内存泄漏(或不断增长的数据结构),那么在某个时候应用程序的内存使用量将停止增长。