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
[51169] Re:Re:TList 메모리해제
전두식 [dsjeon70] 1809 읽음    2007-11-07 12:45
TList를 바로 사용하시지 마시구요..
새로운 메로리를 생성시킨후 사용하세요.

TList *List = new TList();
그리고 해제할때는
while(List->Count){
       delete (TStream *)List->Items[0];
       List->delete(0);
}
List->Clear();

그리고 List라는 개체를 생성후 화면에 빠져나오거나..
사용하지 않을시는 반드시 메모리 해제 하셔야 됩니다.
즉 delete List;
직접 Tool 상에서 코딩해보고 올린게 아니고 그냥 생각난는 데로 적었기 때문에
에러가 발생할수도 있습니다.
도움이 되었음 하는마음에 답변드립니다..

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

+ -

관련 글 리스트
51163 TList 메모리해제 빌더유저 1486 2007/11/06
51166     Re:TList 메모리해제 크레브 2896 2007/11/06
51170         Re:Re:TList 메모리해제 전두식 1766 2007/11/07
51169         Re:Re:TList 메모리해제 전두식 1809 2007/11/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.