除以零会导致Borland C ++中的内存泄漏

时间:2013-09-18 14:00:44

标签: c++ windows c++builder-6 borland-c++

我只是在Borland C ++ Builder Version 6中运行以下代码;

for (int i = 0; i < 40000; i++)
{      
   try {
     __int64 n = 0;
     __int64 r = 1 / n;
   }
   catch (Exception& e) {}
}

并且在运行此循环时,我在任务管理器(内存列)中看到它正在泄漏内存。知道为什么吗?

我在项目中计算模块时遇到内存泄漏,当我尝试除以零并且在打了几个小时之后,在内存泄漏的地方,我意识到它在上面的简单循环中泄漏了内存好。在项目中没有发现任何问题。

2 个答案:

答案 0 :(得分:4)

从标准的5/4我们了解到:

  

如果在评估表达式期间,结果不是   在数学上定义或不在可表示值的范围内   它的类型,行为是未定义的。

因此,由于未按数学方式定义除零,因此行为未定义。未定义的行为包括内存泄漏,因此,进一步推测为什么它正在泄漏内存并不值得(尽管像valgrind这样的工具可能能够帮助您识别源代码)。

答案 1 :(得分:2)

任务管理器不是用于测试内存泄漏的好工具。它只能报告进程分配了多少内存,而不能报告该进程如何使用内存。

您没有考虑的是C ++ Builder的内存管理器缓存释放的内存,它不会立即将其返回给操作系统。您可能看到的是内存碎片,而不是内存泄漏。碎片可以防止内存管理器重用已经缓存的内存,从而分配越来越多的操作系统内存。这将导致您在任务管理器中看到的行为。如果您观看任务管理器的Page Faults列,您会看到该值随内存使用量一起上升。这表明内存没有被重用。

话虽如此,C ++ Builder 6使用的默认内存管理器并不是最好的内存管理器。它在后来的版本中由FastMM替换,它也可以在C ++ Builder 6中使用.FastMM不会受到内存碎片的影响。