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
[47292] Re:메모리메니저 때문입니다.
김상구.패패루 [peperu] 1295 읽음    2006-12-03 13:26
메모리 메니저가 개입하기 때문에 그렇습니다.
즉... 메모리 할당과 파괴가 아주 빈번히 일어나는 경우 이를 매번 메모리를 할당한다면 상당히 효율에 문제가 생기겠죠. 이때문에 메모리 메니저는 나름 최적의 방식으로 메모리 재할당에 관여하기 때문에 소스상에 delete를 해도 실제로 메모리 해제가 일어나지 않는 경우도 많습니다. 예전에 수야님이 질문한 내용과 비슷한 맥락입니다.
그러나 아주 오랜 시간 프로그램이 동작하면 메모리 증감 매우 안정적으로 변합니다. 인터넷에서 FastMM을 찾아보시면 현재 BDS에서 채택한 메모리 메니저 소스를 보실 수 있습니다(어셈입니다)
아니면, 나름대로 고민을 해 보세요. 메모리 메니저를 하나 만든다... 나라면 어떻게 만들것인가...
빈번하게 작은 사이즈의 메모리 할당과 리얼록이 일어나는 경우 어떻게 하면 메모리 복사가 최소한으로 발생하게 메모리 할당시 여분의 공간을 남기고 어떻게 관리할 것인가...
이런걸 고민해 보시면 답은 자연스럽게 나옵니다.


MHyoo 님이 쓰신 글 :
: 메모리가 지속적으로 올라가는 현상때문에
: 어느 부분에서 메모리가 올라가는지 확인하기위해
: TMemoryStatus를 이용하여 메모리값을 체크해보았습니다.
:
:
: 함수를 호출하기 전/후에 메모리값을 체크해보았는데
: 총메모리값(dwTotalPhys)은 변하지 않으나
: 사용 메모리값은 오르락 내리락 하는 현상을 보입니다.
: 하물며, 단순히 함수를 호출하기 전 후에도  메모리가 증가하는 현상이 나타납니다.
: 예를 들어
: A()
: {
:    unsigned long used=0;
:    memfo.dwLength = sizeof(memfo);
:    GlobalMemoryStatus(&memfo);
:    g_WLog->Write("총   메모리크기 = (%d) \n", memfo.dwTotalPhys);
:    used = memfo.dwTotalPhys/1024 - memfo.dwAvailPhys/1024;
:    g_WLog->Write("사용 메모리크기 = (%d) \n", used);          //<-----------------함수 호출전
:
:    B(); 
: }
:
: B()
: {
:    unsigned long used=0;
:    memfo.dwLength = sizeof(memfo);
:    GlobalMemoryStatus(&memfo);
:    g_WLog->Write("총   메모리크기 = (%d) \n", memfo.dwTotalPhys);
:    used = memfo.dwTotalPhys/1024 - memfo.dwAvailPhys/1024;
:    g_WLog->Write("사용 메모리크기 = (%d) \n", used);          //<-----------------단순 호출(처리부 이전)
:   
:    RETURN;
: }
:
: 함수 호출전과 단순 호출(처리부 이전)과 사용 메모리 크기가 차이가 납니다. 증가!!!!!
: 제 생각에는 아무 변화가 없어야 할것 같은데 말입니다.
:
: 또하나 이상한 점은
: 프로그램 내에서 체크한 메모리는 들쭉날쭉 하긴 해도 지속적으로 증가하는 추세는 아닙니다만
: 시스템관리자에서 볼수 있는 메모리값을 체크해보면 지속적으로
: 메모리가 상승합니다....이런...--;;
:
: 체크를 해봐야 하는 메모리값이 총메모리값이 아니고
: 사용메모리 값인가요????
:
: 이와 같은 방법으로 메모리 체크를 하는 것이 맞는지 궁금합니다.
:
: 참고로 사용메모리값은 총 메모리값과 availphys를 가지고 제가 산출한 값입니다.
:
:
: 아래는 생성자와 소멸자에서만 일단 메모리를 체크한 부분입니다.
:
: __fastcall TCTRMsgMaker::TCTRMsgMaker(TComponent *Owner)
: {
: memfo.dwLength = sizeof(memfo);
: GlobalMemoryStatus(&memfo);
: g_WLog->Write("*TCTRMsgMaker생성자 시작*\n");
: unsigned long used=0;
: g_WLog->Write("총   메모리크기 = (%d) \n", memfo.dwTotalPhys);
: used = memfo.dwTotalPhys/1024 - memfo.dwAvailPhys/1024;
: g_WLog->Write("사용 메모리크기 = (%d) \n", used);
:
:     lstImage = new TList;
:
: GlobalMemoryStatus(&memfo);
: g_WLog->Write("*TList new 이후*\n");
: used=0;
: g_WLog->Write("총   메모리크기 = (%d) \n", memfo.dwTotalPhys);
: used = memfo.dwTotalPhys/1024 - memfo.dwAvailPhys/1024;
: g_WLog->Write("사용 메모리크기 = (%d) \n", used);
: }
:
: __fastcall TCTRMsgMaker::~TCTRMsgMaker()
: {
:
: for (int i = 0; i < lstImage->Count; i++)
:     {
:         Graphics::TBitmap *bitmap;
:         bitmap = (Graphics::TBitmap *)lstImage->Items[i];
:         free(bitmap);
:     }
:     if(lstImage)        delete lstImage;
:
: GlobalMemoryStatus(&memfo);
: g_WLog->Write("*TList delete 이후*\n");
: used=0;
: g_WLog->Write("총   메모리크기 = (%d) \n", memfo.dwTotalPhys);
: used = memfo.dwTotalPhys/1024 - memfo.dwAvailPhys/1024;
: g_WLog->Write("사용 메모리크기 = (%d) \n", used);
: }
:
: 그 결과는  이렇습니다.
:
: [22:03:23:562] [PID:120100] Warning정보를 기록합니다.
: [22:03:23:671] *TCTRMsgMaker생성자 시작*
: [22:03:23:671] 총   메모리크기 = (534822912)
: [22:03:23:687] 사용 메모리크기 = (333184)
: [22:03:25:000] *CFDBAccess Dup 이후*
: [22:03:25:000] 총   메모리크기 = (534822912)
: [22:03:25:000] 사용 메모리크기 = (332752)
: [22:03:25:015] *TList new 이후*
: [22:03:25:015] 총   메모리크기 = (534822912)
: [22:03:25:015] 사용 메모리크기 = (332760)
: [22:03:25:015] *aLcsCommInfo memset 이후*
: [22:03:25:015] 총   메모리크기 = (534822912)
: [22:03:25:015] 사용 메모리크기 = (332596)
: [22:06:54:750] *CFDBAccess delete 이후*
: [22:06:54:750] 총   메모리크기 = (534822912)
: [22:06:54:750] 사용 메모리크기 = (331048)
: [22:06:54:750] *TList delete 이후*
: [22:06:54:781] 총   메모리크기 = (534822912)
: [22:06:54:796] 사용 메모리크기 = (331076)
: [22:06:54:796] [PID:120100] Warning정보 기록을 종료합니다.
:
: 총 메모리값은 일정하지만, 사용메모리값은 들쭉날쭉...

+ -

관련 글 리스트
47281 TMemoryStatus 메모리값 체크 MHyoo 1377 2006/12/01
47292     Re:메모리메니저 때문입니다. 김상구.패패루 1295 2006/12/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.