c++ builder/memory leak > FastMM 평가판

동작 확인
C++ Builder XE4

FastMM이라는 메모리 누수 체크 툴을 사용해 보았다.
그 외에는 Eurekalog라는 좋은 툴이 있다는 정보가 있었지만, 본가의 사이트는 계속 사이트 메인터넌스 상태가 되고 있다(2016년 4월 16일 현재).
(추기 2016/07/15) htps //w w. 어쨌든 g. 코m/ 에 접속할 수 있게 되어 있었다.

메모리 누수 코드



버튼을 누를 때 메모리 누수 코드.

Unit1.cpp
...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringList *lst = new TStringList();

    // without delete lst;
}
//---------------------------------------------------------------------------

FastMM 얻기



htps : // 기주 b. 코 m / p ぇ 리치 / 퐁 st m4
오른쪽 상단의 "DownLoad ZIP"버튼을 눌러 FastMM4-master.zip을 가져옵니다.

얻은 zip 파일을 확장합니다.

FastMM4BCB.cpp에 설명된 절차



펼쳐진 폴더 안에 있는 FastMM4BCB.cpp의 헤더 부분에 C++ Builder에서의 사용 순서가 기재되어 있다.

절차



소스 폴더로 복사



1) Copy FastMM4BCB.cpp, FastMM4.pas, FastMM4Message.pas, FastMM4Options.inc, and FastMM_FullDebugMode.lib to your source folder.

5 개의 파일을 소스 (Unit1.cpp)가있는 폴더에 복사합니다.

FastMM_FullDebugMode.lib는 FullDebugMode DLL\CPP Builder Support에 있습니다.

실행 폴더로 복사



2) Copy FastMM_FullDebugMode.dll to your application's .exe directory (if you intend to use FullDebugMode).

FastMM_FullDebugMode.dll은 FullDebugMode DLL\Precompiled에 있습니다.

FastMM_FullDebugMode.dll을 빌드에서 만든 .exe 파일의 위치에 복사합니다(예: Win32/Debug/).

프로젝트에 추가 및 컴파일



3) To your project, add FastMM4Messages.pas first, then FastMM4.pas, then FastMM4BCB.cpp. On compiling the .pas files, .hpp files are created and imported by the subsequent files.

3개의 파일을 프로젝트에 추가하면서, 하나하나 프로젝트를 빌드해 본다(파일 단위로 빌드하면 .hpp를 찾을 수 없게 되었다?).

프로젝트 파일 재작성



4) Add USEOBJ("FastMM4BCB.cpp") to your project file, BEFORE any other USEFORM directives.

프로젝트를 닫고 프로젝트 .cpp 파일을 다시 씁니다.

Project1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
...

을 다음과 같이 하였다.

Project1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
USEOBJ("FastMM4BCB.cpp"); // 追加
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
...

프로젝트 설정 변경



5) Under the Project -> Options -> Linker menu uncheck "Use Dynamic RTL"(sorry, won't work with the RTL DLL).
FastMM will now install itself on startup and replace the RTL memory manager.

프로젝트 옵션인 "C++ 링커"의 "동적 RTC와 링크"를 false로 했다.

실행



작성한 프로젝트를 빌드하고 실행하고 버튼을 누른 후 종료하면 다음과 같은 메시지가 나타났다.



FullDebugMode



FastMM에는 FullDebugMode라고 하는 것이 있어, 소스의 어느 장소가 메모리 리크인지 로그를 취할 수 있는 것 같은데, C++ Builder로 시도하려고 하면 「DebugGetMem 라벨이 없다」라고 하는 에러가 되어 빌드할 수 없게 되었다.

라는 것이 어제의 시험용이었지만, 이하의 순서로 잘 동작했다.

프로젝트 옵션 설정



참고 htp // mrx 등 y. 그래. 코오칸. jp/에서 lp 히/오테 rs/우사게후 stm. htm

C++(공유 옵션) > 조건 정의에 다음 네 가지 추가
  • FullDebugMode
  • EnableMemoryLeakReporting
  • LogMemoryLeakDetailToFile
  • ClearLogFileOnStartup

  • 실행



    프로젝트를 다시 빌드하고 실행합니다. 버튼을 눌러 메모리 누수를 발생시켜 앱을 종료합니다.

    다음 파일이 Win32\Debug 폴더에 만들어졌습니다.
    Project1_MemoryManager_EventLog.txt

    위의 파일에는 다음과 같은 설명이 있습니다.

    403FEE [Unit1.cpp][Unit1.cpp][Button1Click][19]

    Unit1.cpp의 19번째 행에서 메모리 누수가 일어나고 있다는 것.

    19행째는 이하.
        TStringList *lst = new TStringList();
    

    좋은 웹페이지 즐겨찾기