Журнал утечки памяти Valgrind

0

В 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);
  • 0
    Этот фрагмент не похож на настоящий фрагмент, скорее на приблизительное.
  • 0
    Он был извлечен из моего кода, файл имел 15K строк. Я только что опубликовал точный код, где valgrind показал использование неинициализированного значения.
Показать ещё 2 комментария
Теги:
valgrind
memory-leaks

1 ответ

0

Руководство valgrind подробно описывает это. Это довольно сложно - см. Ссылку на полную информацию, но по существу вы можете:

  • "все еще достижимый" (память, на которую указывает указатель).
  • "непосредственно потерянный" (память, на которую не указана ни одна живая стрелка)
  • "косвенно потерянный" (память, на которую указывает указатель, который находится в памяти, "потерянный")
  • "возможно, потерян" (на память указана точка, но указатель не указывает на начало памяти).

Последним случаем может быть некоторый случайный указатель, и он может быть чем-то вроде диспетчера памяти, который выделяет красную зону перед возвратой памяти пользователю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню