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
[60884] Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다.
이경문 [gilgil] 1221 읽음    2010-04-24 16:09
음... 소스를 보니 조금 위험한 부분이 보이는 것 같습니다.

AddTrace에서 메모리 할당이 되고
char *mChar = new char[mLenght + 1];

WndProx안에서 메모리 해제가 되는데
delete [] ((char *)Msg.WParam);

PostMessage의 형식으로 전달이 되는 경우
Memory Management 영역의 critical section 처리가 되지 않아서
에러를 발생할 수도 있을 것이라는 생각이 듭니다.


이길남.HoPe 님이 쓰신 글 :
: 안녕하세요. 아래와 같이 이벤트 로그 클래스를 구성하였습니다.
:
:
: CSimpleTrace *SimpleTrace[5] = { NULL, NULL, NULL, NULL, NULL };
: //---------------------------------------------------------------------------
: //      CSimpleTrace
: //                                                          Date : 09.11.05
: //                                                          Dev. : HoPe
: //---------------------------------------------------------------------------
: __fastcall CSimpleTrace::CSimpleTrace(String AFileName)
: {
:     FFileName = AFileName;
:     FDirectory = ExtractFilePath(ParamStr(0)) + "TRACE LOG\\";
:     if(!DirectoryExists(FDirectory))    ForceDirectories(FDirectory);
: 
:     DeleteOldFiles(31);
:     FWindowHandle = AllocateHWnd(WndProc);
: }
: //---------------------------------------------------------------------------
: __fastcall CSimpleTrace::~CSimpleTrace(void)
: {
:     DeallocateHWnd(FWindowHandle);
: }
: //---------------------------------------------------------------------------
: 
: void __fastcall CSimpleTrace::DeleteOldFiles(int ABeforeDay)
: {
:     TSearchRec mSr;
:     if(FindFirst(FDirectory + "*.*", faAnyFile, mSr) == 0)
:     {
:         do
:         {
:             if(mSr.Name == ".")                                     continue;
:             if(mSr.Name == "..")                                    continue;
:             if(mSr.Attr == faDirectory)                             continue;
: 
:             if(Now() - ABeforeDay <= FileDateToDateTime(mSr.Time))  continue;
:             DeleteFile(AnsiString(FDirectory + mSr.Name).c_str());
:         }
:         while(!FindNext(mSr));
:     }
: }
: //---------------------------------------------------------------------------
: 
: void __fastcall CSimpleTrace::WndProc(TMessage &Msg)
: {
:     if(Msg.Msg == WM_USER + 1)
:     {
:         SaveString((char *)Msg.WParam, Msg.LParam);
: 
:         delete [] ((char *)Msg.WParam);
: 
: //        free((char *)Msg.WParam);
:     }
: }
: //---------------------------------------------------------------------------
: void __fastcall CSimpleTrace::SaveString(char *AString, int ALength)
: {
:     FILE *mFile = fopen(AnsiString(FDirectory + FFileName + ".INI").c_str(), "a+");
:     if(mFile)
:     {
:         try
:         {
:             fwrite(AString, sizeof(char), ALength, mFile);
:         }
:         __finally
:         {
:             fclose(mFile);
:         }
:     }
: }
: //---------------------------------------------------------------------------
: void __fastcall CSimpleTrace::AddTrace(String AMessage)
: {
:     int mLenght = AMessage.Length();
:     char *mChar = new char[mLenght + 1];
: //    char *mChar = (char *)malloc(mLenght + 1);
: 
:     mChar[mLenght] = '\n';
:     memcpy(mChar, AMessage.c_str(), sizeof(char) * mLenght);
:     PostMessage(FWindowHandle, WM_USER + 1, (unsigned int)mChar, mLenght + 1);
: //    free((char *)mChar);
: }
: //---------------------------------------------------------------------------
: 

:
: 하지만 아래 버튼 1번을 클릭하고 난 후, 메모리가 계속 증가만(첨부 파일 참조) 되고 줄어들지가 않습니다.
: 이유를 찾을 수가 없습니다.
:
: 고수님들의 조언을 부탁드립니다. 수고하십시요.
:
:
: __fastcall TForm1::TForm1(TComponent* Owner)
:     : TForm(Owner)
: {
:     SimpleTrace[0] = new CSimpleTrace("INPUT");
: }
: //---------------------------------------------------------------------------
: 
: void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
: {
:     delete SimpleTrace[0];
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
:     for(int i = 0; i < 1000000; i++)
:     {
:         SimpleTrace[0]->AddTrace(Edit1->Text);
:     }
: }
: //---------------------------------------------------------------------------
: 

+ -

관련 글 리스트
60871 동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이길남.HoPe 1415 2010/04/23
60885     Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이현수 1486 2010/04/24
60888         Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이길남.HoPe 1356 2010/04/25
60892             Re:Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이길남.HoPe 1470 2010/04/26
60884     Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이경문 1221 2010/04/24
60887         Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이길남.HoPe 1178 2010/04/25
60872     Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. locke 1277 2010/04/23
60882         Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이길남.HoPe 1416 2010/04/24
60883             Re:Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 장성호 1394 2010/04/24
60886                 Re:Re:Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이길남.HoPe 1391 2010/04/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.