크레브 님이 쓰신 글 :
: 다들 바쁘셨나봅니다. 답변을 안해주시고..^^
: TList의 Clear는 원래 메모리를 해제해 주지 않습니다.
: 헬프에 Clear also 'frees the memory used to store the Items array' and sets the Capacity to 0.
: 라고 써 있는것은..
: 아이템 배열을 저장했던 메모리를 해제해 준다는 의미 입니다.
: 각각의 아이템 자체의 메모리를 해제해 준다는것이 아니죠
: 즉 아이템 자체의 메모리 해제는 사용자 몫이라는겁니다.
: TList 관련 도움말 보다보면 어딘가 설명 나오는데 지금은 못찾겠네요..
: 아무튼.. TList는 원래 직접 해제하는 방식으로 쓰시면 되고..
:
: 씨빌더에서 List 관련 클래스가 몇개 있습니다.
:
: TList
: TObjectList
: TThreadList...
: 이외에도 많지만..
:
: 남이 원하시는 자동으로 해제되는 기능은 TObjectList에 있습니다.
: 각각의 아이템이 TObject를 상속 받아야 하는 제한이 있어서 귀찮아서 잘 안씁니다만..
: 암튼.. 원하신다면 이걸 쓰시고요..
: 링크참조하세요 다른분이 올린 TObjectList관련 글입니다.
:
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=700
:
: 멀티쓰레드 관련 Lock 기능을 위해서는 TThreadList를 쓰셔야 합니다.
: 물론 아이템의 메모리 해제 기능은 없고요.. 쓰레드 Lock 기능이 있습니다.
:
: 빌더에서 메모리 누수 쉽게 찾는 방법은 따로 없는듯합니다.
: 모든 C 프로그래밍이 그렇듯이..
: 코딩 한줄한줄 조심해서 하시고..
: 사용하는 클래스, 라이브러리의 메모리 관리 방법 잘 찾아보시고..
:
: 정 안되면..
: 코드 가드 옵션 켜놓고 컴파일 하면 나오는 경우도 있지만..
: 항상 잘되는건 아니라서.. 참고만 할수 있을것 같습니다.
:
:
:
:
: 빌더유저 님이 쓰신 글 :
: : 메모리 누수에 관해서 질문했엇는데 아무도 답글을 안달아주시네요 ㅠㅠ
: : 윈도우즈 작업관리자로 메모리를 보니
: : 갈수록 점점 커져서, 몇일 동안 헤메다가 겨우 원인을 알았네요
: :
: : TList 를 사용해서 파일 스트림을 읽어
: : 메모리에 모든 파일을 저장해두고 사용했엇는데
: : TStream *strm1 = new TStream;
: : strm1->LoadFromFile("filename1");
: : TList->Add(strm1);
: :
: : TStream *strm2 = new TStream;
: : strm2->LoadFromFile("filename2");
: : TList->Add(strm2);
: : ....
: :
: : 파일들을 다시 새로 읽어들일때
: : TList에 연결된 스트림을 다지우고 다시읽어들이려고 TList::Clear을보니
: : TList::Clear Description에
: : Clear also 'frees the memory used to store the Items array' and sets the Capacity to 0.
: : 이라고 써있어서
: :
: : TList->Clear();
: : ...
: : 로 초기화하고 다시 파일을 읽어들였는데
: : 알고보니 메모리 해제를 제대로 못하더군요;;
: : 실제로 Clear()은
: : for(int i=0; i<DBPhotoList->Count; i++)
: : delete DBPhotoList->Items[i];
: : 이런식으로 아이템들을 지우는듯합니다.
: : 그래서
: : for(int i=0; i<DBPhotoList->Count; i++)
: : delete []DBPhotoList->Items[i];
: : TList->Clear();
: : 이렇게 직접 아이템들을 지웠더니 깔끔하게 메모리가 해제되더군요 ㅎㅎ;
: :
: : 이거 알아내는데 1주일걸린 ㅜㅜ.
: :
: : 다시한번 질문합니다.~
: : 메모리누수 빌더에서 어떻게 쉽게 찾나요??