안녕하세요. 아래와 같이 이벤트 로그 클래스를 구성하였습니다.
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);
}
}
//---------------------------------------------------------------------------
|