c++中的动态二维数组和内存泄漏
Posted
技术标签:
【中文标题】c++中的动态二维数组和内存泄漏【英文标题】:Dynamic 2d array in c++ and memory leaks 【发布时间】:2010-04-28 00:07:04 【问题描述】:我写了这段代码。它运行正常,但是当我在 Valgrind 下检查它时,它发现了 2 个问题。由于我无法解释 valgrind 的消息,如果有人向我解释并告诉我问题出在哪里,我将不胜感激!!!
代码如下:
#include <iostream>
#define width 70000
#define height 10000
using namespace std;
int main(void)
int** pint;
pint = new int*[height];
for(int i = 0; i < height; i++)
pint[i] = new int[width];
for(int i = 0; i < height; i++)
delete[] pint[i];
pint[i] = NULL;
delete[] pint;
pint = NULL;
return 1;
【问题讨论】:
valgrind 的抱怨是什么? 如果没有看到投诉,我们无法告诉您 valgrind 问题是什么。 也许发布 valgrind 消息 - 乍一看,这段代码看起来不错。 有大量的消息,我怎样才能在这里得到所有这些消息?你能在你的机器上运行代码吗...? 【参考方案1】:好的,我在 3.4 中收到了几个 Valgrind 警告,但只有第一个很重要。
new/new[] 失败,应该抛出异常,但 Valgrind 不能抛出异常,因此正在中止。对不起。
new
内存不足时会抛出异常(除非您使用 new 的 nothrow 版本)。不幸的是,Valgrind 无法处理它并在您的代码完成之前放弃了。因为 valgrind 中止,所以释放内存的代码永远不会执行,这会显示为内存泄漏。
也就是说,您没有处理新抛出的情况,因此如果您的内存不足,您的程序将由于未处理的异常而死亡。您需要使用 try/except 块包装您的代码。
【讨论】:
最后 valgrind 道歉了,Visual Studio 崩溃时从不道歉。【参考方案2】:在我看来,它在抱怨某些 new[]
s 失败了。如果您减小height
和/或width
的大小,则可以正常工作。您可能试图分配过多的内存。
编辑:那是在我的 32 位机器上。如果我在我的 64 位机器上运行它,那很好。因此,您可能会在 32 位机器上达到内存限制。
【讨论】:
以上是关于c++中的动态二维数组和内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章