У меня есть наглядный фрагмент кода:
#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;
}
Это вызывает ошибку в Valgrind, но я действительно не знаю, что это значит и как это исправить ... может ли кто-нибудь дать мне совет?
==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)
3 ответа
matrix[0] = (int *) realloc(matrix[0], c * sizeof (int));
Вы передаете matrix[0]
в качестве параметра без его предварительной инициализации.
Вы можете использовать более мощную утилиту. BoundsChecker, Deleaker, XWatcher ...
Советую использовать deleaker - мощный инструмент для устранения утечек памяти!
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
std::vector<int>
- наиболее логичный выбор. Никакого перераспределения, никаких хлопот.realloc
зависит от значения первого параметра. В вашем случае он должен быть NULL, иначе произойдет сбой.(pointer to (malloc-ated array of (pointer to an (malloc-ated array of int))))
; поэтому вы должны заполнить их значениями NULL; однако прислушайтесь к совету @Diallecticus и избавьтесь от некоторых проблем, используя вектор