2015-06-25 2 views
1

Рассмотрим этот код:Почему valgrind сообщает, что моя память «определенно потеряна»?

#include <stdlib.h> 

int* alloc() 
{ 
    return malloc(250 * sizeof(int)); 
} 

int main() 
{ 
    int i; 
    int *vars[3]; 
    for(i = 0; i < 3; ++i) { 
     vars[i] = alloc(); 
    } 
} 

Valgrind выход:

$ valgrind --leak-check=full ./lala 
==16775== Memcheck, a memory error detector 
==16775== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==16775== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info 
==16775== Command: ./lala 
==16775== 
==16775== 
==16775== HEAP SUMMARY: 
==16775==  in use at exit: 3,000 bytes in 3 blocks 
==16775== total heap usage: 3 allocs, 0 frees, 3,000 bytes allocated 
==16775== 
==16775== 3,000 bytes in 3 blocks are definitely lost in loss record 1 of 1 
==16775== at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==16775== by 0x4005B3: alloc (lala.c:5) 
==16775== by 0x4005DF: main (lala.c:13) 
==16775== 
==16775== LEAK SUMMARY: 
==16775== definitely lost: 3,000 bytes in 3 blocks 
==16775== indirectly lost: 0 bytes in 0 blocks 
==16775==  possibly lost: 0 bytes in 0 blocks 
==16775== still reachable: 0 bytes in 0 blocks 
==16775==   suppressed: 0 bytes in 0 blocks 
==16775== 
==16775== For counts of detected and suppressed errors, rerun with: -v 
==16775== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) 

В соответствии с Valgrind's manual:

Если --leak проверка устанавливается соответствующим образом, для каждого оставшегося блока, Memcheck определяет, доступен ли блок из указателей в корневом наборе . Корневой набор состоит из (a) регистров общего назначения всех потоков и (b) инициализированных, выровненных, слов данных размера указателя в доступной клиентской памяти, включая стеки.

За то, что я понимаю, так как «определенно потерял» память по-прежнему указывают на из стека main() функция, они должны быть классифицированы как «все еще достижим», верно?

Если нет, то как я могу настроить Valgrind, чтобы попытаться достичь блоков памяти из стека main, чтобы определить, являются ли они «еще доступными»?

EDIT:

Пожалуйста, не говори мне free указатели в конце main, что это не то, что я прошу о. Для различения между «еще достижим» и «определенно потеряли» на условиях VALGRIND см этот ответ: https://stackoverflow.com/a/3857638/578749

+0

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

+0

Мой ответ был неправильным ответом. Я удалил это. –

+0

Когда основные концы, программа заканчивается, и память все равно будет освобождена. См. [Этот ответ] (http://stackoverflow.com/a/3857638/578749). – lvella

ответ

8

Ваша память, безусловно, теряется, когда стек main разрушается, то есть, когда он возвращается. Таким образом, решение не должно возвращаться.

#include <stdlib.h> 
int main() 
{ 
    /* your code here */ 
    exit(0); 
} 

Поведения или основное возвращение 0 или exit(0) должно быть эквивалентно.

Теперь выход:

==5035== Memcheck, a memory error detector 
==5035== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==5035== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info 
==5035== Command: ./a.out 
==5035== 
==5035== 
==5035== HEAP SUMMARY: 
==5035==  in use at exit: 3,000 bytes in 3 blocks 
==5035== total heap usage: 3 allocs, 0 frees, 3,000 bytes allocated 
==5035== 
==5035== LEAK SUMMARY: 
==5035== definitely lost: 0 bytes in 0 blocks 
==5035== indirectly lost: 0 bytes in 0 blocks 
==5035==  possibly lost: 0 bytes in 0 blocks 
==5035== still reachable: 3,000 bytes in 3 blocks 
==5035==   suppressed: 0 bytes in 0 blocks 
==5035== Reachable blocks (those to which a pointer was found) are not shown. 
==5035== To see them, rerun with: --leak-check=full --show-leak-kinds=all 
==5035== 
==5035== For counts of detected and suppressed errors, rerun with: -v 
==5035== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 
Смежные вопросы