c ++中的动态二维数组和内存泄漏

时间:2010-04-28 00:07:04

标签: c++ dynamic arrays 2d valgrind

我写了这段代码。它运行正常,但是当我在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;
}

2 个答案:

答案 0 :(得分:6)

好的,我在3.4中遇到了几个Valgrind警告,但只有第一个很重要。

  

new / new []失败并且应该抛出异常,但Valgrind不能抛出异常,因此正在中止。遗憾。

new在内存不足时抛出异常(除非您使用new的nothrow版本)。不幸的是,Valgrind在代码完成之前无法处理并放弃。因为valgrind中止,所以你永远不会执行释放内存的代码,这会显示为内存泄漏。

那就是说,你没有处理新抛出的情况,所以如果你的内存不足,你的程序会因为未处理的异常而死亡。您需要使用try / except块包装代码。

答案 1 :(得分:5)

在我看来,它抱怨某些new[]失败了。如果您缩小height和/或width的大小,那么它可以正常工作。你可能试图分配太多的内存。

编辑:这是在我的32位盒子上。如果我在我的64位盒子上运行它,那很好。因此,您可能会在32位计算机上达到内存限制。