다들 바쁘셨나봅니다. 답변을 안해주시고..^^
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주일걸린 ㅜㅜ.
:
: 다시한번 질문합니다.~
: 메모리누수 빌더에서 어떻게 쉽게 찾나요??