2011-12-18 1 views
5

봐 뭔가 이상한 :그냥 루프, 33 누수

==725== Memcheck, a memory error detector 
==725== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 
==725== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 
==725== Command: ./a.out hello my friends 
==725== 
--725-- ./a.out: 
--725-- dSYM directory is missing; consider using --dsymutil=yes 
./a.out 
hello 
my 
friends 
==725== 
==725== HEAP SUMMARY: 
==725==  in use at exit: 6,146 bytes in 33 blocks 
==725== total heap usage: 33 allocs, 0 frees, 6,146 bytes allocated 
==725== 
==725== LEAK SUMMARY: 
==725== definitely lost: 0 bytes in 0 blocks 
==725== indirectly lost: 0 bytes in 0 blocks 
==725==  possibly lost: 0 bytes in 0 blocks 
==725== still reachable: 6,146 bytes in 33 blocks 
==725==   suppressed: 0 bytes in 0 blocks 
==725== Rerun with --leak-check=full to see details of leaked memory 
==725== 
==725== For counts of detected and suppressed errors, rerun with: -v 
==725== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 1 from 1) 

누군가가 이유를 알고 있으며, 수 경우 여기

$> cat main.c 
#include <stdio.h> 
int main(int ac, char **av) { 
    for (int i = 0; i < ac; i++) 
     printf("%s\n", av[i]); 
    return 0; 
} 
$> gcc main.c -std=c99 
$> valgrind ./a.out hello my friends 

그리고는 결과입니다 어디에서 theses 누수가 온다 나에게 설명해라, 나는 감사 할 것이다!!

좋은 하루 되십시오 :-)

+0

'--leak-check = full'을 사용하여 다시 실행하십시오. 할당은 실제 누수가 아닌 환경 (일회성 시작/초기화 작업)에 의해 수행되는 시스템 작업임을 알 수 있습니다. – Mat

+1

valgrind 출력 메시지에서 제안한 "누출 된 메모리의 세부 정보를 보려면 --leak-check = full로 다시 실행 하시겠습니까?" – bobbymcr

답변

9

이들은 누출이 아닙니다. still reachable으로 표시된 개체는 문제가되지 않습니다. 위의 행에 0이 아닌 값을 지정하면 알람 벨이 울립니다.

still reachable으로 나열된 33 개의 블록은 대부분 표준 라이브러리에서 printf 호출로 할당 된 블록 일 수 있습니다. 걱정할 것이 없다.

비슷한 질문으로 this answer을 살펴보십시오.

+0

완벽. 답변 주셔서 감사합니다 :-) – DCMaxxx

3

"still reachable" 프로그램이 종료되었을 때 걱정할 필요가 없습니다.

"still reachable"은 아직 릴리스되지 않은 메모리가 할당되었지만이 메모리를 가리키는 포인터가 있음을 의미합니다. 따라서 valgrind는 실제 메모리 "누출"로 플래그하지 않습니다.

시간을 낭비하는 것은 종종 낭비입니다. 응용 프로그램이 종료되기 전에 할당 된 메모리가 할당되면 응용 프로그램이 종료되기 때문에 할당 된 메모리가 OS로 반환됩니다.

+0

내 경험에 따르면, 실행이 끝나면 모든 오브젝트를 올바르게 비우는 것이 중요합니다. 그렇게 많은 버그를 발견했습니다. '누출'이라고 생각되는 것의 중력은 미미하지만, 그것이 부과 한 정확성에 대한 운동은 광범위한 재연을합니다. 큰 프로젝트에서는 진정한 차이를 만들 수 있습니다. 그것은 실제로 내가 작업 한 2 개의 큰 프로젝트 (C의 500K와 150K 라인)에서 수행되었습니다. –