C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[57957] Re:free로 반환하는데 왜 메모리가 줄지 않을까요.. ㅠㅠ
박지훈.임프 [cbuilder] 1357 읽음    2009-08-06 09:44
먼저 마지막 코드부터. 단순한 코딩 실수네요.
test_malloc_new = new unsigned char(256);
이게 아니라,
test_malloc_new = new unsigned char[256];
이렇게 하셨어야 하죠. 뭐가 다른지 보이시죠?

다음으로...
PSAPI 관련 API 함수들은 그다지 실시간으로 아주 정확한 값을 리턴하지는 않습니다. 작업관리자에서도 마찬가지구요. 할당한 메모리 크기가 적은 경우 몇번의 할당이 모인 후에 한꺼번에 반영되어 리턴되기도 하고 해제도 마찬가지입니다. 그래서 버튼1과 버튼2의 코드를 여러번 반복해서 실행하거나 할당 단위 메모리를 더 크게 늘리면 기대하신 대로 결과가 나올 겁니다.

p.s.
GetProcessMemoryInfo는 PDH보다는 훨씬 나은 방법이긴 하지만 최선의 방법은 아닙니다.


영악한녀석  님이 쓰신 글 :
: 안녕하십니까? 선배님들께 조언좀 구하겠습니다.
: 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를 안하는 경우를 제외하고 또 어떤 경우가 있을까요?

+ -

관련 글 리스트
57953 free로 반환하는데 왜 메모리가 줄지 않을까요.. ㅠㅠ 영악한녀석 1057 2009/08/05
57957     Re:free로 반환하는데 왜 메모리가 줄지 않을까요.. ㅠㅠ 박지훈.임프 1357 2009/08/06
57959         Re:Re:free로 반환하는데 왜 메모리가 줄지 않을까요.. ㅠㅠ 영악한녀석 1167 2009/08/06
57966             Re:Re:Re:free로 반환하는데 왜 메모리가 줄지 않을까요.. ㅠㅠ 아제나 1329 2009/08/07
57978                 Re:Re:Re:Re:free로 반환하는데 왜 메모리가 줄지 않을까요.. ㅠㅠ 영악한녀석 1514 2009/08/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.