2

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

2 回答 2

6

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

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

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

也就是说,您没有处理新抛出的情况,因此如果内存不足,您的程序将由于未处理的异常而死亡。您需要使用 try/except 块包装您的代码。

于 2010-04-28T00:25:40.203 回答
5

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

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

于 2010-04-28T00:21:15.030 回答