Почему Valgrind не сообщает о каких-либо проблемах после освобождения памяти mallo c? - PullRequest
3 голосов
/ 10 февраля 2020

Я пытаюсь выяснить, почему Valgrind не выдает никакого предупреждения, даже если в следующем фрагменте кода нет free после malloc:

#include "stdlib.h"
#include "string.h"

char* ptr;

int main (int argc, char *argv[]) {
    ptr = static_cast<char*>(malloc(5 * sizeof(char)));
    strcpy(ptr, "test");
}

Есть ли что-то вроде "автомати c бесплатно" я не в курсе или я что-то упускаю?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 10 февраля 2020

Я сообщаю о проблеме, но чтобы увидеть ее, вам нужно запустить Valgrind с параметрами --leak-check=full --show-leak-kinds=all:

$ valgrind --leak-check=full --show-leak-kinds=all ./a.out
==317235== Memcheck, a memory error detector
==317235== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==317235== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==317235== Command: ./a.out
==317235== 
==317235== 
==317235== HEAP SUMMARY:
==317235==     in use at exit: 5 bytes in 1 blocks
==317235==   total heap usage: 2 allocs, 1 frees, 72,709 bytes allocated
==317235== 
==317235== 5 bytes in 1 blocks are still reachable in loss record 1 of 1
==317235==    at 0x483980B: malloc (vg_replace_malloc.c:309)
==317235==    by 0x40113E: main (1.cpp:7)
==317235== 
==317235== LEAK SUMMARY:
==317235==    definitely lost: 0 bytes in 0 blocks
==317235==    indirectly lost: 0 bytes in 0 blocks
==317235==      possibly lost: 0 bytes in 0 blocks
==317235==    still reachable: 5 bytes in 1 blocks
==317235==         suppressed: 0 bytes in 0 blocks
==317235== 
==317235== For lists of detected and suppressed errors, rerun with: -s
==317235== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Даже если вы запустите Valgrind без каких-либо опций, вы можете увидеть проблему в разделе HEAP SUMMARY :

==317235==     in use at exit: 5 bytes in 1 blocks

, но без каких-либо подробностей.

2 голосов
/ 10 февраля 2020

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

Время жизни указателя stati c - это полное выполнение процесса. Таким образом, значение указателя никогда не терялось, потому что оно всегда сохранялось, и ни в одной точке программы не было ситуации, когда указатель не мог быть освобожден.

Valgrind документация классифицирует такие память как:

«Все еще достижимо». Это охватывает случаи 1 и 2 (для блоков BBB) выше. Начальный указатель или цепочка начальных указателей на блок найдены. Поскольку на блок все еще указывают, программист мог бы, по крайней мере, в принципе, освободить его до выхода из программы. «Все еще достижимые» блоки очень распространены и, возможно, не являются проблемой. Таким образом, по умолчанию Memcheck не будет сообщать о таких блоках по отдельности.


Существует ли какой-то тип "automati c free"

Не в смысле вызова free, но как только программа останавливается, она больше не существует, и ее выделения не имеют значения.

...