Valgrind недействительное чтение ошибок размера 4?

Вопрос: Я получаю эту ошибку в Valgrind после попытки освободить список. Это важные части Вальгринда ==12349== Invalid read of size 4 ==12349== at 0x8048BB4: DynArray::addMovie(Movie*) (in /home/admin/a2/mbd) ==12349== by 0x8048D11: main (in /home/admin/a2/mbd) ==12349== Address 0x4321060 is 0 bytes after a block of size 0 alloc'd ==12349== at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==12349==

Вопрос:

Я получаю эту ошибку в Valgrind после попытки освободить список.

Это важные части Вальгринда

==12349== Invalid read of size 4 ==12349== at 0x8048BB4: DynArray::addMovie(Movie*) (in /home/admin/a2/mbd) ==12349== by 0x8048D11: main (in /home/admin/a2/mbd) ==12349== Address 0x4321060 is 0 bytes after a block of size 0 alloc’d ==12349== at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==12349== by 0x8048B62: DynArray::DynArray() (in /home/admin/a2/mbd) ==12349== by 0x8048C87: main (in /home/admin/a2/mbd) ==12349== ==12349== Invalid read of size 4 ==12349== at 0x8048BB4: DynArray::addMovie(Movie*) (in /home/admin/a2/mbd) ==12349== by 0x8048D97: main (in /home/admin/a2/mbd) ==12349== Address 0x4321114 is 0 bytes after a block of size 4 alloc’d ==12349== at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==12349== by 0x8048B90: DynArray::addMovie(Movie*) (in /home/admin/a2/mbd) ==12349== by 0x8048D11: main (in /home/admin/a2/mbd) ==12349== ==12349== Invalid read of size 4 ==12349== at 0x8048BB4: DynArray::addMovie(Movie*) (in /home/admin/a2/mbd) ==12349== by 0x8048E1D: main (in /home/admin/a2/mbd) ==12349== Address 0x43211d0 is 0 bytes after a block of size 8 alloc’d ==12349== at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==12349== by 0x8048B90: DynArray::addMovie(Movie*) (in /home/admin/a2/mbd) ==12349== by 0x8048D97: main (in /home/admin/a2/mbd)

Важные части DynArray.cc

DynArray::DynArray() { size = 0; array = new Movie *[size]; } void DynArray::addMovie(Movie* m) { size++; Movie **temp = new Movie *[size]; for (int x = 0; x < size; x++) { temp[x] = array[x]; } delete [] array; temp[size-1] = m; array = temp; } void DynArray::cleanup() { for (int x = 0; x < size; x++) delete array[x]; delete [] array; } int main() { DynArray *a = new DynArray(); Movie *m = new Movie(«sa», 2129, C_COMEDY); a->addMovie(m); Movie *k = new Movie(«sas», 4324, C_DRAMA); a->addMovie(k); Movie *l = new Movie(«dsad», 43241, C_DRAMA); a->addMovie(l); for (int x = 0; x < a->size; x++) { a->array[x]->printMovie(); } a->cleanup(); delete a; return 0; }

Класс фильма на самом деле не настолько, что я могу опубликовать его, если потребуется.

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

size изначально равен 0, а выделенный буфер – 0 байтов. Когда первый фильм добавлен, вы увеличиваете size слишком рано. Он становится равным 1, и вы читаете array[0] в цикле for.

Кстати, ваша стратегия изменения размера смертельно неэффективна… рассмотрите возможность удвоения размера массива по мере необходимости.

Ответ №1

Функция addMovie недействительна.

void DynArray::addMovie(Movie* m) { size++; Movie **temp = new Movie *[size]; for (int x = 0; x < size; x++) { temp[x] = array[x]; } delete [] array; temp[size-1] = m; array = temp; }

Вы увеличили размер объекта и попытались получить доступ к элементу массива с размером индекса – 1, который не существует в массиве. Цикл должен быть таким же

for (int x = 0; x < size — 1; x++) { temp[x] = array[x]; }

Оцените статью
Добавить комментарий