음... 소스를 보니 조금 위험한 부분이 보이는 것 같습니다.
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);
: }
: }
: //---------------------------------------------------------------------------
: