我只是在Borland C ++ Builder Version 6中运行以下代码;
for (int i = 0; i < 40000; i++)
{
try {
__int64 n = 0;
__int64 r = 1 / n;
}
catch (Exception& e) {}
}
并且在运行此循环时,我在任务管理器(内存列)中看到它正在泄漏内存。知道为什么吗?
我在项目中计算模块时遇到内存泄漏,当我尝试除以零并且在打了几个小时之后,在内存泄漏的地方,我意识到它在上面的简单循环中泄漏了内存好。在项目中没有发现任何问题。
答案 0 :(得分:4)
从标准的5/4我们了解到:
如果在评估表达式期间,结果不是 在数学上定义或不在可表示值的范围内 它的类型,行为是未定义的。
因此,由于未按数学方式定义除零,因此行为未定义。未定义的行为包括内存泄漏,因此,进一步推测为什么它正在泄漏内存并不值得(尽管像valgrind这样的工具可能能够帮助您识别源代码)。
答案 1 :(得分:2)
任务管理器不是用于测试内存泄漏的好工具。它只能报告进程分配了多少内存,而不能报告该进程如何使用内存。
您没有考虑的是C ++ Builder的内存管理器缓存释放的内存,它不会立即将其返回给操作系统。您可能看到的是内存碎片,而不是内存泄漏。碎片可以防止内存管理器重用已经缓存的内存,从而分配越来越多的操作系统内存。这将导致您在任务管理器中看到的行为。如果您观看任务管理器的Page Faults
列,您会看到该值随内存使用量一起上升。这表明内存没有被重用。
话虽如此,C ++ Builder 6使用的默认内存管理器并不是最好的内存管理器。它在后来的版本中由FastMM替换,它也可以在C ++ Builder 6中使用.FastMM不会受到内存碎片的影响。