2014-02-11 5 views
1

Я получаю эту ошибку в Valgrind после попытки освободить список.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 0x60 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; 
    } 

Класс фильм не так уж специально я могу разместить его в случае необходимости

ответ

0

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

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

+1

спасибо Я работал его, о не тревожится о том, что его часть уступки я обязан делать это определенным образом – user3296933

+0

Вы приветствуете. Рассмотрите возможность выживания и/или принятия ответов (ответов), которые вы считаете более полезными. Stack Overflow основан на системе репутации. – gd1

2

Функция 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]; 
    } 
Смежные вопросы