Что означают эти сообщения об ошибках отладчика valgrind / GNU?

0

Моя программа заканчивается правильно, и, согласно Valgrind, нет утечки памяти.

Но следующее сообщение появляется, когда метод объекта запускается в первый раз.

Use of uninitialised value of size 8

Получение более подробной информации о вышеупомянутых yeilds

==18787== Use of uninitialised value of size 8
==18787==    at 0x4017F3: Grid::init(int) (grid.cc:90)
==18787==    by 0x401D2A: main (main.cc:43)
==18787==  Uninitialised value was created by a stack allocation
==18787==    at 0x401BE4: main (main.cc:11)

Я также вижу следующие сообщения:

Conditional jump or move depends on uninitialised value(s)
Invalid free() / delete / delete[] / realloc()
Address 0x7ff000b08 is on thread 1 stack

Вот код Grid :: init

void Grid::init(int n){
    if (!(&(this->theGrid))) { this->clearGrid(); } //If non-empty, destroys grid

    this->theGrid = new Cell*[n]; //Create new grid of size n x n
    this->td = new TextDisplay(n); //new Text Display 
    for (int i = 0; i < n; i++){
        this->theGrid[i] = new Cell[n];
        for(int j = 0; j < n; j++){ //Cell initializations
            (this->theGrid[i][j]).setDisplay(this->td); //set display
            (this->theGrid[i][j]).setCoords(i, j); //set co-ordinates
            (this->theGrid[i][j]).setState(0); //default state
        }
    }
}
  • 0
    Итак, каков код Grid::init и какая строка является строкой 90?
  • 2
    ... а какая линия это линия 90?
Показать ещё 3 комментария
Теги:
debugging

1 ответ

2
Лучший ответ

Я предполагаю, что у вас есть код, который выглядит так:

Условный переход или перемещение зависят от неинициализированного значения (значений):

bool value /* nothing */;
if (value) {
}

Недействительный бесплатный:

char* buf = new char[10000];
buf = &x;
delete [] buf;

Теперь, когда вы разместили код, я предполагаю, что строка 90 - это:

if (!(&(this->theGrid))) { this->clearGrid(); } //If non-empty, destroys grid

И дело в том, что вы не инициализируется theGrid к nullptr в конструкторе, а затем в конечном итоге, возможно, delete[] -ing в non- new[] -ed массив. Кроме того, этот код будет выглядеть чище, если вы только что сделали:

if (!theGrid) {
    clearGrid();
}

Вам не нужно this-> везде. И я не понимаю, почему вы берете адрес theGrid.

  • 0
    На самом деле конструктор имеет "this-> theGrid = NULL;". Имеет ли значение использовать вместо этого nullptr? И что означает, что (! TheGrid) означает? Означает ли это, что theGrid не равен нулю? Или это означает, что theGrid равен нулю?
  • 0
    Нет, это не так, и вам действительно не нужно это - this-> везде. !theGrid проверяет theGrid . Но вы действительно хотите проверить, что theGrid равен NULL, а не является ли адрес theGrid ненулевым. Это не эквивалентно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню