В valgrind у нас есть журналы утечки, подобные этому
==15788== 480 bytes in 20 blocks are definitely lost in loss record 5,016 of 5,501
==20901== 112 (48 direct, 64 indirect) bytes in 2 blocks are definitely lost in loss record 3,501 of 5,122
==20901== 1,375,296 bytes in 78 blocks are possibly lost in loss record 5,109 of 5,122
==20901== Conditional jump or move depends on uninitialised value(s)
==20901== Use of uninitialised value of size 8
В документации Valgrind я не смог найти точные данные. Может понравиться кому-нибудь объяснить
Я знаю определенно потерянные средства - выделенная память вовсе не освобождается. Но может ли это означать "20 блоков" и что означает "потерянный в записи потерь 5016 из 5 501". И если он говорит, что 480 байтов потеряны, значит ли это для одного прогона в цикле или в целом??
Во второй строке "112 (48 прямых, 64 косвенных) байта в 2 блока, безусловно, потеряны", что означает "48 прямых, 64 косвенных".
И я понимаю смысл "возможно потерянный", но значит ли это, что valgrind не уверен, что это утечка.?
А что касается 4-й линии, я вообще понятия не имею. Я проверил стек вызовов, предоставленный вместе с этой 4-й строкой. Я не замечаю никаких "прыжков или движений".
Для 5-й строки он говорит, что uninitialised находится в последней строке этого фрагмента кода. Я не вижу здесь никакой неинициализированной ценности.
char *data = new char[somebigSize];
memset(data, '\0', somebigSize);
int sizeInt = sizeof(int);
int length = 20; //some value obtained
int position = 10;
char *newPtrVar = new char[sizeInt + 1];
memset(newPtrVar, '\0', sizeInt + 1);
memcpy(newPtrVar, &length, sizeInt);
memcpy(&data[position], newPtrVar, sizeInt);
Руководство valgrind подробно описывает это. Это довольно сложно - см. Ссылку на полную информацию, но по существу вы можете:
Последним случаем может быть некоторый случайный указатель, и он может быть чем-то вроде диспетчера памяти, который выделяет красную зону перед возвратой памяти пользователю.