2013-06-10 2 views
5

큰 프로그램에서 메모리 누수가 발생했으며 이것이 원인이라고 생각합니다.char 포인터가 배열 메모리 누수입니다.

#include <stdlib.h> 
#include <Windows.h> 

typedef struct _struct{ 
    char* name; 
} str; 

int main() { 
    system("PAUSE"); 

    str* Character = (str*)malloc(sizeof(str) * 20000); 

    for(int i = 0; i < 20000; i++){ 
     Character[i].name = (char*)malloc(20000); // Assign memory. 
    } 

    for(int i = 0; i < 20000; i++){ 
     free(Character[i].name);   // Free memory. 
    } 

    free(Character); 
    system("PAUSE"); 
} 

첫 번째 일시 중지시 메모리 : ~ 500K.

두 번째 일시 중지시 메모리 : ~ 1.7M.

테스트를 위해 VS2012 사용. 어떤 아이디어?

+1

코드가 올바르게 보입니다. 어떻게 메모리 사용을 측정하고 있습니까? 힙 관리자가'free'에 대한 호출에 따라 단순히 힙을 압축하지 않았을 가능성이 있습니까? 이 경우 여분의 메모리는 프로세스에 할당되지만 프로그램에서 사용하지 않으므로 실제로 다른 코드가 할당 할 수 있습니다. – simonc

+0

malloc을 사용할 때 pls는 메모리가 실제로 할당되었는지 확인해야합니다 (문자 == NULL) – hazzelnuttie

+0

malloc에서 반환 값을 캐스팅하지 않아야합니다. 이것은 C이며 void *를 지정할 수 있습니다. –

답변

4

어떻게 프로그램에서 차지하는 메모리 양을 측정하고 있습니까? 내 머리 꼭대기에있는 한 가지는 OS가 추적하고있는 작업 세트의 크기를보고 있다는 것입니다. 많은 메모리를 할당하고 해제 했으므로 그 세트의 크기가 증가했습니다. 일부 OS는 작업 세트의 크기를 잠시 후에 조정할 것이고, 일부는 그렇지 않을 수도 있습니다. 우리가 여기서보고있는 OS는 무엇입니까?

+0

Windows 7 Ultimate 및 작업 관리자의 메모리 사용 – Marc

+0

Windows가 수행하는 작업 (나중에 확인하거나 다른 사람이 작성할 수 있음)을 정확히 모르겠지만 예상 한 내용이 표시되지 않을 수 있습니다. 최신 운영 체제는 처리량을 줄이기 위해 프로세스 메모리를 크고 게으른 방식으로 관리하며 페이지 할당을 지연시킬 수 있습니다. malloc과 free의 구현은 메모리를 예약 할 수도 있습니다. 확실하게 알고 싶다면 valgrind와 같은 도구를 사용하여 누출 여부를 확인하십시오. – idoby

+0

방금 ​​DrMemory로 실행했고 319 개의 도달 가능한 할당으로 3 개의 (1536 바이트) 가능한 누출을 발견했습니다. – Marc

3

malloc을 호출하면 메모리가 힙에 할당됩니다. 힙에 남아있는 공간이 충분하지 않은 경우 프로그램은 OS에 더 많은 메모리를 요청하고 다른 청크를 획득합니다. OS에서 획득 한 메모리는 일반적으로 프로그램이 끝날 때까지 반환되지 않습니다 (OS에 따라 다름).

프로그램 누락만으로는 메모리 누수를 검사 할 수 없습니다. Valgrind 또는 유사한 도구를 사용하여 절대로 free d가되는 메모리를 확인하십시오.

-1

str * 문자 = (str *) malloc (sizeof (str) * 20000);

위 줄에서 구조체의 크기를 찾아 메모리를 할당합니다. 여기서 얻을 수있는 구조체의 크기는 char의 크기가 아니라 포인터 너비의 크기가됩니다.

예를 들어 포인터 너비가 32 비트 인 경우 (4 * 20000) = 80000 바이트를 할당한다고 가정합니다.

는 20000 구조체의에 할당하려면

,

STR의 * 문자 = (캐릭터의 *) malloc을 (를 sizeof (문자) * 20000);

+1

str * 문자는 구조체의 배열이며 문자가 아닙니다 (혼동 할 수있는 이름입니다). sizeof (str)가 맞습니다. –