2010-11-21 10 views
5

mam to udowodnić kawałek kodu:Valgrind C++ przecieki

#include <cstdlib> 
#include <cstdio> 

int main() { 
    int ** matrix = NULL; 
    int c = 1, input = 0; 

    printf("Enter first row of the matrix:\n"); 
    while (!feof(stdin)) { 
     input = fgetc(stdin); 

     matrix = (int**) realloc(matrix, 1 * sizeof (int*)); 
     if (matrix == NULL) { 
      printf("Troubles with memory allocation!\n"); 
      return 0; 
     } 
     matrix[0] = (int *) realloc(matrix[0], c * sizeof (int)); 
     matrix[0][c-1] = (int) input; 

     c++; 
    } 

    free(matrix[0]); 
    free(matrix); 

    return 0; 
} 

Powoduje to w Valgrind błąd, ale ja naprawdę nie wiem, co to znaczy i jak to naprawić ... Czy ktoś mi doradzi?

==30031== 1 errors in context 1 of 1: 
==30031== Conditional jump or move depends on uninitialised value(s) 
==30031== at 0x402868B: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==30031== by 0x80485CB: main (main.cpp:17) 
==30031== Uninitialised value was created by a heap allocation 
==30031== at 0x402860A: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==30031== by 0x4028694: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==30031== by 0x80485A6: main (main.cpp:12) 
+0

Nie zainicjalizowano macierzy [0] przed drugim ponownym wywołaniem. Może być wypełniony czymkolwiek. – wj32

+5

BTW, należy rozważyć użycie kontenerów STL, 'std :: vector ' jako najbardziej logiczny wybór. Bez ponownego nakładu, bez kłopotów. – Dialecticus

+0

Jeśli jest to tablica 2-wymiarowa, z jaką wartością należy ją wypełnić? –

Odpowiedz

6

matrix[0] = (int *) realloc(matrix[0], c * sizeof (int));

są przechodzącą matrix[0] jako parametr bez inicjowanie go wcześniej.

1

Możesz użyć bardziej wydajnego narzędzia. BoundsChecker, Deleaker, XWatcher ...

+2

Wypróbuj http://irazin.ru/Programms/XWatcher.htm –

1

Polecam użyć deleaker - potężnego narzędzia do debugowania wycieków pamięci!

+2

Dodałem link do oprogramowania dla Witamy na stronie z0r1fan! –

+0

+5 świetny debugger :) –