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
[50299] Re:TStringGrid 사용시 메모리 누적오류문제
크레브 [kkol] 1459 읽음    2007-08-16 23:12
TStringGrid는 메모리 해제가 제대로 안되는것으로 보입니다.
처음 설정한 Row, Col에서 그냥 쓰기 위한 목적으로 개발되어 그런건지
메모리 동작할당 해제가 제대로 안됩니다.

저도 여러가지 방법으로 해결하려고 했지만 결국 실패하고

로그 관련 프로그램 만들때 TListView로 사용하였습니다.
이 콤포넌트는 해제가 잘됩니다. 참고하시길
아니면 제일 간단한 TMemo쓰시길..



조상진 님이 쓰신 글 :
: 안녕하세요.. __);
:
: 질문드릴 내용은 TStringGrid의 올바른 사용법(?)입니다.
:
: Builder 6를 이용하여 통합관리 모니터를 작성했습니다.
:
:
: TStringGrid 2개를 사용하여..
:
: 하나는 Back으로 보이지 않게 작성한 후에, 수신된 모든 데이터는 우선 Back에 넣습니다.
:
: 다른 하나는 Fore로서 사용자에게 리스트를 보여주는 역할을 하는데요. Back의 수신 내용중 최신 데이터 3000개만 뽑아서 Fore에서 보여주는 것입니다.
:
: Fore가 사용자에게 내용을 보여주는 동안에도 Back은 계속해서 데이터를 수신하려는 의도에서 이렇게 만들었습니다.
:
: Fore에서 새로고침을 누르면 역시 Back의 수신 내용중 최신 데이터 3000개만 뽑아서 보여주는 방식이지요.
:
: Back은 수신된 데이터가 3600건이 되면 오래된 600건을 자동으로 삭제합니다.
:
:
: 그런데 TStringGrid 사용법이 잘못되어.. 테스트 환경에서 프로그램을 기동시키면 메모리양이 계속해서 누적되다가, 약 3시간 정도면 메모리 부족으로 인해 프로그램이 죽어버립니다.
:
: 추가, 삭제 부분의 코드를 올려보겠습니다. 보시고 잘못된 점이나 이상한 점이 있다면 지적해 주십시요.
:
: 아마도 삭제시에 단순 Clear()가 아닌 무언가의 작업이 필요한 것으로 생각됩니다.
:
: 그럼... 원하시는 대로 즐프 되시길 바라겠습니다.. __);
:
:
: ---- 추가 -------------------------------------------------------------------------
: int TReportDlg::InsertData( TStringGrid * pTarget, AnsiString strCommaData, bool bAddLineNum)
: {
:     AnsiString strLineNum;
:     int nCount = pTarget->RowCount;
:
:     //라인번호를 작성.
:     strLineNum.printf("%d,", nCount);
:
:     // 컴마 텍스트 방식으로 TStringGrid에 내용 추가.
:     pTarget->Rows[nCount-1]->CommaText = strLineNum + strCommaData;
:     return nCount;
: }
: `
: ---- 삭제 -------------------------------------------------------------------------
: int TReportDlg::RemoveOldData( TStringGrid * pTarget, int nRemoveCount)
: {
:     int nCount = 0;
:
:     // 삭제할 크기가 1보다 작거나, 현재 보유한 리스트의 내용이 삭제할 크기보다 작다면 삭제하지 않는다.
:     if( nRemoveCount < 1 || (nCount = pTarget->RowCount - nRemoveCount) < 1) {
:         return (pTarget->RowCount);
:     }
:
:     // 3600개의 데이터가 있을 경우 오래된 600개의 데이터는 삭제한다.
:     // 0번째에 600번째 데이터([0] = [600]), 1번째에 601([1] = [601])번째 데이터를 넣는 방식으로
:     // 오래된 데이터를 삭제한다.
:     for(int i = 0; i < nCount; i++) {
:         pTarget->Rows[i]->Clear();
:         pTarget->Rows[i] = pTarget->Rows[i+nRemoveCount];
:         pTarget->Rows[i+nRemoveCount]->Clear();
:     }
:
:     pTarget->RowCount = nCount;
:     return nCount;
: }
:
: ---- 전체삭제 ---------------------------------------------------------------------
: void TReportDlg::RemoveAllData(TStringGrid * pTarget)
: {
:     for(int i = 0; i < pTarget->ColCount; i++) {
:         pTarget->Cols[i]->Clear();
:     }
:     pTarget->RowCount = 1;
:     pTarget->Rows[0]->CommaText = "";
:
:     return;
: }

+ -

관련 글 리스트
50122 TStringGrid 사용시 메모리 누적오류문제 조상진 1225 2007/07/30
50299     Re:TStringGrid 사용시 메모리 누적오류문제 크레브 1459 2007/08/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.