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
[60872] Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다.
locke [syiware] 1276 읽음    2010-04-23 11:34
안녕하세요? locke입니다.

소스 잠깐 봤는데요. PostMessage로 로그 발생시키도록 하신건 괜찮은 아이디어 같습니다.

근데 메모리 해제이전에 SaveString() 함수를 호출해서 매번 파일을 열고 닫으시는데

이건 좀 부적합해 보입니다. 지금은 테스트라 그냥 루프 돌리셨겠지만.. 이 루프가 상당히 빠르거든요.

파일 열고 닫는 시간에 수도 없이 호출이 될거고.. 파일 핸들 하나같고 access 충돌도 발생할텐데

로그저장은 잘 되는지요? 로그에 순번 매겨서 한번 저장해보세요. 제가 볼땐 제대로 저장이 안될듯 싶습니다.

받는 쪽에서 무작위로 발생하는 메시지 수신값에 대한 저장방식을 달리하셔야 될듯 싶구요.

파일 액세스 쪽에서 오류가 나서 동적메모리 할당 부분을 실행하지못하고 루틴을 빠져나가는게 아닌가 싶네요.

그냥 제 의견입니다. 참고하시고 다른 전문가 분이 도움주시리라 생각합니다.

-locke


이길남.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 1355 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 1276 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.