2012-01-23 1 views
2

valgrind를 사용하여 내 프로그램이 클래스의 필수 메모리 범위 내에 있는지 확인합니다. 대용량 광고를 실행하면 내 최대 메모리 사용량 (힙 + 스택)이 21KB라는 예쁜 차트가 나타납니다. valgrind의 memcheck을 실행하면 185931 바이트가 할당되었음을 알 수 있습니다. 그들이보고하는 내용의 차이점은 무엇입니까? 중요하다면, 내가 두 개의 문자열을 표시하는 코드에 단계가 있으므로 realloc을 사용하여 첫 번째 문자열의 크기를 조정하고 두 개의 문자열을 strcat로 변환 한 다음 두 번째 문자열을 해제하십시오.대용량 메모리의 메모리 수와 memcheck의 메모리 수의 차이점은 무엇입니까?

+0

memcheck는 할당 총량을 계산합니다. 메모리를 해제하고 새 메모리를 할당하면 memcheck에 포함되지만, 대용량 파일은 주어진 순간에 필요한 실제 실제 공간의 양만 측정합니다. (그러나 이것에 대해서는 잘 모르겠습니다). –

답변

5

Memcheck는 메모리 누수를 찾기 위해 모든 메모리 할당의 총계 (그리고 모든 해제의 합계)를 계산합니다.

Massif는 프로그램의 메모리 사용 공간을 조사하기 위해 프로그램의 각 지점에서 사용중인 총 메모리를 계산합니다. 프로그램은 다음과 같습니다 경우 즉

:

int main(void) 
{ 
    free(malloc(10*1024)); 
    free(malloc(10*1024)); 
    return 0; 
} 

그런 Memcheck는 당신에게 말할 것이다이 :

total heap usage: 2 allocs, 2 frees, 20,480 bytes allocated 

대산 괴 당신이 말할 것이다 반면 :

-------------------------------------------------------------------------------- 
    n  time(i)   total(B) useful-heap(B) extra-heap(B) stacks(B) 
-------------------------------------------------------------------------------- 
    0    0    0    0    0   0 
    1  130,386   10,248   10,240    8   0 
    2  131,436   10,248   10,240    8   0 
99.92% (10,240B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. 
->99.92% (10,240B) 0x8048407: main (in /home/kevin/miscdev/so/x) 

을 (프로그램 수명 기간 동안 20480 바이트가 할당되었지만 최대 사용량은 10240 바이트에 불과했습니다).

+0

미래의 모든 시청자를 위해 memcheck는 realloc을 자유 및 malloc으로 할당/무료 카운트로 계산합니다. 아마도 realloc의 구현과는 독립적입니다. (필자는 realloc에 ​​대한 호출을 캡처하고 카운트를 증가시킨 다음 "실제"realloc을 호출한다고 생각하지만 100 % 확실하지는 않습니다.) – AVB