Проблема с выделением новой памяти для массива в C ++ - PullRequest
0 голосов
/ 11 февраля 2011

Хорошо, мне трудно понять, что я делаю неправильно. В моем заголовочном файле у меня есть указатель на массив указателей на изображения:

Image **images;
int maximum; //size

Это часть класса, который называется сцена. Теперь сцена имеет функцию-член changemax, которая изменяет размер массива изображений. Вы можете уменьшить или увеличить.

Итак, я установил временный массив с именем newArray, скопировал все значения из this->images, удалил this->images, затем выделил новую память для images, скопировал из newArray в images, а затем удалите newArray.

Я получаю более 100 000 ошибок с Valgrind, хотя код компилируется. В частности, я не думаю, что Valgrind нравится строка, которая говорит images=new Image*[newmax];

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

У вас наверняка есть утечка памяти:

newArray[i]=new Image;
if(images[i] !=NULL) {
    // ...
}
else {
    newArray[i]=NULL;
}

Почему вы создаете два новых массива?Вам нужно только создать один новый массив, скопировать содержимое старого массива в новый массив, уничтожить старый массив, а затем назначить images, чтобы указать на новый массив.

Почему вы создаете новыйImage объектов?Поскольку вы изменяете только размер массива images, вы можете просто переместить все имеющиеся у вас указатели в новый массив, не создавая новых объектов Image.

Как я уже говорил в комментарияхДля этого вам абсолютно необходимо использовать std::vector или какой-либо другой контейнер последовательностей из стандартной библиотеки C ++, например std::vector<Image>.Требования плохие, и я настоятельно рекомендую изменить дизайн.

1 голос
/ 11 февраля 2011

Весь этот фрагмент кода абсолютно неверен и может быть заменен ровно одной правильной строкой:

images=new Image*[newmax];
for (int i=0;i<newmax;i++){
    if (newArray[i]!=NULL) {
        images[i]=new Image;
        *images[i]=*newArray[i];
    }
    else {
        images[i]=NULL;
    }

    delete newArray[i];
}
delete [] newArray;

, и в коде не появляется ничего похожего на эту строку.Ну, ладно, первая строка смутно похожа, но только смутно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...