Ошибка шины при вызове Delete (C ++) - PullRequest
1 голос
/ 09 февраля 2010

Я создавал класс, который берет кучу изображений и накладывает их на один BMP. По какой-то причине после запуска кода я получаю ошибку segfault и отследил ее до этого метода. По сути, оператор if проверяет, существует ли допустимый индекс в массиве изображений для размещения этого нового изображения. Если он действителен, то он удаляет все, что было ранее, и устанавливает этот индекс для этого нового изображения. Класс называется Scene и состоит из массива указателей изображений. Поэтому я заменяю изображение, на которое указывает один из этих указателей. Как-то не работает, хотя. Если указатель равен NULL, команда delete не должна вызывать проблем, поэтому я не вижу, что может пойти не так. Этот код действует на сцену, которая имеет массив указателей изображения длиной 5.

void Scene::addpicture(const char* FileName, int index, int x, int y)
{
 if (index<0 || index>maxnum-1)
 {
  cout << "index out of bounds" << endl;
 }

 else
 {
        Image* extra;
        extra = new Image;
        extra->ReadFromFile(FileName);

        delete imagelist[index];


        imagelist[index] = extra;
        imagelist[index]->xcoord=x;
        imagelist[index]->ycoord=y;
 }
}

Может кто-нибудь помочь. Это будет высоко ценится.

Спасибо

Я редактировал, чтобы включить конструктор:

Scene::Scene(int max)
{
Image** imagelist = new Image*[max];
for(int i=0; i<max; i++)
{imagelist[i] = NULL;}

maxnum = max;
}

Я также прокомментировал основной метод, так что единственными вызываемыми функциями являются

Scene* set = new Scene(5);
set->addpicture("in_01.bmp", 0, 0, 0);

Ответы [ 3 ]

4 голосов
/ 09 февраля 2010

В вашем конструкторе у вас есть локальный список изображений, но вы используете поле imagelist в addpicture.Вы скрываете поле списка изображений в конструкторе, и поле никогда не инициализируется.

Исправьте это, заменив эту строку:

Image** imagelist = new Image*[max];

На это:

imagelist = new Image*[max];
1 голос
/ 09 февраля 2010

SEGFAULT означает, что вы пытаетесь получить доступ к месту за пределами того, что вы должны быть. В своем комментарии к Месе вы говорите, что это происходит по команде delete.

Итак, я спрашиваю вас: когда вы создаете класс Scene, вы явно инициализируете указатели в imagelist в NULL? Другими словами, есть ли такие строки:

for (i=0; i<maxnum; i++) {
    imagelist[i] = NULL;
}

в вашем конструкторе, или вы предполагаете, что неинициализированные массивы начинаются как заполненные нулями? (В отличие от большинства языков, это предположение плохо в C ++.)

0 голосов
/ 09 февраля 2010

Этот код выглядит нормально, я думаю, что ошибка в какой-то другой части программы. Может быть, массив imagelist не инициализирован в NULL? Или maxnum не является фактическим размером imagelist. Или что-то другое.

Что именно терпит неудачу - у вас есть traceback?

...