SimpleTrace[0]이 TForm1과 동일한 스레드에 있네요.
따라서, Button1Click 메서드 안의 for 루프를 모두 돈 다음에
메시지 펌프 루프로 돌아가서 GetMessage를 호출해서,
Button1Click 메서드 안에서 호출한 SimpleTrace의 AddTrace 메서드 안에서 PostMessage로 보낸,
메시지들을 받게 되어있는데 Button1Click 메서드 안의 for 루프를 도는 횟수가 무려 백만 번이나 되어서
메시지 큐가 오버플로우되면서 이후 메시지들은 메시지큐에 들어가지 않을 것으로 보입니다.
그렇게 되면 SimpleTrace의 AddTrace 메서드에서 할당한 메모리는 해제될 기회가 없겠지요.
SimpleTrace[0]이 TForm1과 다른 스레드에 있을 때도 SimpleTrace 스레드의 처리속도에 따라
이러한 문제가 발생될 소지가 있을 것이구요.
이길남.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);
: }
: }
: //---------------------------------------------------------------------------
: