|
안녕하십니까? 선배님들께 조언좀 구하겠습니다.
malloc으로 메모리 할당하고 free로 반환했는데 왜 메모리 사용량이 줄지 않는건가요?
아래는 메모리 사용을 체크하는 함수입니다.
size_t __fastcall TForm1::MemoryCheck()
{
PROCESS_MEMORY_COUNTERS PMC;
HANDLE hProcess = NULL;
hProcess = GetCurrentProcess();
if(hProcess == NULL)
{
return false;
}
GetProcessMemoryInfo(hProcess, &PMC, sizeof(PROCESS_MEMORY_COUNTERS));
CloseHandle(hProcess);
return PMC.WorkingSetSize;
}
말록으로 메모리를 잡아보겠습니다.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
size_t a;
Memo1->Lines->Add("━━━━━━━━━━━━━━━━━━");
a = MemoryCheck();
Memo1->Lines->Add(IntToStr(a));
test_malloc = (unsigned int *)malloc(sizeof(unsigned int) * 250);
a = MemoryCheck(); //메모리가 4kb단위로 늘어남. OS에서 메모리를 4KB단위로 프로세스에게 할당하는것 같음.
Memo1->Lines->Add(IntToStr(a));
Memo1->Lines->Add("━━━━━━━━━━━━━━━━━━");
}
free 하겠습니다.
void __fastcall TForm1::Button3Click(TObject *Sender)
{
size_t a;
Memo1->Lines->Add("━━━━━━━━━━━━━━━━━━");
a = MemoryCheck();
Memo1->Lines->Add(IntToStr(a));
free(test_malloc);
a = MemoryCheck(); /////메모리 줄어들지 않았음 ㅠ.ㅠ
Memo1->Lines->Add(IntToStr(a));
Memo1->Lines->Add("━━━━━━━━━━━━━━━━━━");
}
동적 할당을 new로 해보겠습니다.
void __fastcall TForm1::Button4Click(TObject *Sender)
{
size_t a;
Memo1->Lines->Add("━━━━━━━━━━━━━━━━━━");
a = MemoryCheck();
Memo1->Lines->Add(IntToStr(a));
test_malloc_new = new unsigned char(256);
a = MemoryCheck(); ///메모리 할당이 안됨. 수리적으로 256x20 = 5120 OS에서 자원을 안주네요 ㅠㅠ
Memo1->Lines->Add(IntToStr(a));
Memo1->Lines->Add("━━━━━━━━━━━━━━━━━━");
}
현재 제가 짜 놓은 테스트 프로그램에서 malloc을 하면 자원을 할당받고 free하면 자원을 반환하지 못하고 new하면 자원을 할당받지 못하고 있는데요.. 과연 무슨 문제 일까요?
제가 생각했던 부분 중에 하나는 바로 TMemo 컴퍼넌트에 데이터가 출력되기 때문이라는 가정을 짓고 free를 1024번 반복시켰으나 메모리가 줄어들지는 않네요.. ㅠ.ㅠ 선배님들!! 좋은가르침 부탁드립니다.
Windows XP 기반입니다. OS가 프로세스들의 메모리를 어떻게 관리 하는지 알고 싶습니다.
코딩시 메모리 누수가 나는 경우가 이리저리 찾아보면 많을 거리 생각 됩니다.
대표적인 malloc 후 free를 안하거나 new 후 delete를 안하는 경우를 제외하고 또 어떤 경우가 있을까요?
|