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
[57978] Re:Re:Re:Re:free로 반환하는데 왜 메모리가 줄지 않을까요.. ㅠㅠ
영악한녀석 [akrnldytpq] 1513 읽음    2009-08-08 13:37
아제나님 감사합니다.

코드가드를 쓰는 요령을 정확하게 파악해서 사용해봐야 겠네요. 사실 제가 지금 사용하는게 빌더를 사용하는게 아니라 bds를 사용하고 있습니다. 물론 bds 나 비슷하고 코드가드 기능도 있는것 같은데 코드가드 기능에 레벨이 있는 것 같더라고요.

그리고 메모리 해제가 아닌것처럼 보이는 이유가 실시간으로 갱신되지 않기 때문이었군요.. ㅠㅠ 근데 알약이나 여타 다른 프로그램들은 메모리가 증가했다가 다시 줄어들었다가 하는게 보이던데...

괴롭습니다.. 메모리란 정말 보면 볼수록 오묘한 영역인것 같습니다.. ㅠㅠ




아제나 님이 쓰신 글 :
: 메모리 누수 체크는 아주 간단하게 CodeGuard를 enable 시키는 것으로 대부분의 작업에서
: 누수 여부를 체크할 수 있습니다.
: 빌더의 장점을 이용하세요~
:
: 전 프로그램 개발할 때 항상 CodeGuard를 씁니다. 모든 상황에서 프로그램이 종료할 때
: CodeGuard가 메시지를 뿜지 않아야 정상적이라고 할 수 있죠.
: 릭 보고가 없다면 대부분의 상황에서 누수가 없다고 생각하셔도 됩니다.
:
: 추가적으로 new char[]로 할당된 녀석들은 delete[]로 해제해주어야 됩니다.
: 보통은 이렇게 쓰면 이게 메모리 블럭인가 객체인가 해깔리기 때문에
: 객체 할당이 아닌 메모리 할당은 malloc(), free()를 강력히 권장합니다. (속도도 더 빠릅니다)
: 메모리 해제가 안 되는 것처럼 보이는 이유는 실시간으로 메모리 사용량이 갱신되지 않기 때문입니다.
: 그 메카니즘은 MS에서 메모리 메카니즘을 공개하지 않고 있기 때문에 정확하게 알고 있는 사람이 없을 겁니다.
:
:
:
: 영악한녀석 님이 쓰신 글 :
: : 헛..
: : 역시 선배님께서 보시니까 아주 기본적인 부분이.. ㅠ.ㅠ
: :
: : 근데 사실 어제 제가 테스트 했던 메모리 용량은 sizeof(unsigned int) * 10240이었습니다... 사이즈가 40960이겠네요..
: : 메모리 사용량을 아무리 늘려도 한번 호출할 때 운영체제(Window XP)에서는 4KB씩 밖에 할당을 해주지 않더군요,..
: :
: : 메모리란 참 오묘하네요.. ㅠ.ㅠ
: :
: : free 또는 delete 했을 때 메모리 사용량이 줄지 않는 이유가 데체 어디에 있는 것인가요..
: :
: : 박지훈.임프 님이 쓰신 글 :
: : : 먼저 마지막 코드부터. 단순한 코딩 실수네요.
: : : 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로 반환하는데 왜 메모리가 줄지 않을까요.. ㅠㅠ 영악한녀석 1056 2009/08/05
57957     Re:free로 반환하는데 왜 메모리가 줄지 않을까요.. ㅠㅠ 박지훈.임프 1357 2009/08/06
57959         Re:Re:free로 반환하는데 왜 메모리가 줄지 않을까요.. ㅠㅠ 영악한녀석 1166 2009/08/06
57966             Re:Re:Re:free로 반환하는데 왜 메모리가 줄지 않을까요.. ㅠㅠ 아제나 1328 2009/08/07
57978                 Re:Re:Re:Re:free로 반환하는데 왜 메모리가 줄지 않을까요.. ㅠㅠ 영악한녀석 1513 2009/08/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.