Динамический 2d массив в c ++ и утечки памяти - PullRequest
2 голосов
/ 28 апреля 2010

Я написал этот код. Он работает нормально, но когда я проверяю его под Valgrind, он обнаруживает 2 проблемы. Поскольку я не могу интерпретировать сообщения Вальгринда, я буду признателен, если кто-нибудь объяснит мне больше и скажет, в чем проблема !!!

Вот код:

#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 ]

6 голосов
/ 28 апреля 2010

Хорошо, есть пара предупреждений Valgrind, которые я получаю с 3.4, но важно только первое.

new / new [] не удалось и должен выдать исключение, но Valgrind не может выдать исключения и поэтому отменяет. К сожалению.

new выдает исключение, когда ему не хватает памяти (если вы не используете новую версию nothrow). К сожалению, Valgrind не может справиться с этим и сдается до завершения вашего кода. Поскольку valgrind прерывается, ваш код для освобождения памяти никогда не выполняется, что проявляется в утечках памяти.

Тем не менее, вы не обрабатываете случай, когда генерируются новые броски, поэтому ваша программа умрет из-за необработанного исключения, если у вас закончится память. Вам нужно обернуть свой код блоком try / исключением.

5 голосов
/ 28 апреля 2010

Мне кажется, что он жалуется, что некоторые из new[] не работают. Если вы уменьшите размер height и / или width, то он работает нормально. Вы, вероятно, пытаетесь выделить слишком много памяти.

РЕДАКТИРОВАТЬ : Это на моей 32-битной коробке. Если я запускаю его на своем 64-битном компьютере, это нормально. Таким образом, вы, вероятно, достигли предела памяти на 32-разрядной машине.

...