【发布时间】:2013-01-30 04:22:43
【问题描述】:
我在使用 C++ Builder 6 编写的某些应用程序时遇到问题。运行一段时间(周、月)后,应用程序崩溃并关闭,没有任何错误消息。在崩溃前不久的应用程序日志中,我收到了许多“内存不足”异常。 当它抛出内存异常(下面的屏幕截图)时,我查看了该进程,它有很多未提交的私有内存空间。这种行为的原因是什么?
几年前我曾经遇到过这样的问题。原因是链接器选项中未选中“使用动态库”选项。当我检查回来时,问题消失了,反之亦然。我制作的测试应用程序只是调用“new char [1000000]”然后删除。每次都会释放内存(Windows 任务管理器中没有提交的内存增加),但一段时间后我的内存不足,VMMap 显示完全相同的内容。大量保留的私有内存,但大部分未提交。
现在问题又回来了,但我无法以同样的方式解决它。我不知道这是否是原因,但我将 Builder 6 和 2010 安装在同一台机器上。现在我只有 Builder 6,似乎我无法像以前一样使用测试应用程序重现错误。以太方式似乎存在一些内存管理器错误或其他东西。 CodeGuard 不显示任何内存泄漏。当我用“新”创建内存块时,它会立即显示在“内存提交大小”中,当删除时内存使用量减少,所以我假设内存泄漏不是这种情况,任务管理器没有显示太多“内存提交大小” .
有什么我可以做的吗?有什么办法可以释放未提交的内存?如何进一步诊断问题?
【问题讨论】:
-
您是否正在调用一个 Window API,该 API 返回您未释放的已分配内存,codeguard 可能无法捕获这些。 Codeguard 并非万无一失。
-
该应用程序有数千行代码,所以可能有一些。例如,我想通过 Directsound 播放波浪。但是由于项目的规模和它所连接的各种硬件设备的依赖性(我在这里非常有限),很难定位问题。
-
我担心的是为什么它释放了保留块的大部分空间并留下了一些 kb 提交?这不是很奇怪吗?有大量的 1.9MB 块被提交了大约 50KB(截图)。不释放不应该提交吗,即使是API分配?
-
还有一件事。对于“Codeguard 并非万无一失”。是的,我知道,我的假设不仅仅是基于它,实际上我几乎没有使用它。我看到的主要问题是内存似乎被释放了,因为应用程序的内存使用量并没有增加太多。它是正在使用的应用程序虚拟内存地址空间。而且我自己无论如何也无法模拟这种行为,所以我不知道要寻找什么。
-
相当老但仍然很有趣的问题......必须添加一些东西所以看看我的答案
标签: c++ windows memory memory-management c++builder-6