[MFC] Cum detectez memory leaks?

Despre MFC, ATL si alte biblioteci C++ de la Microsoft (forum moderat)
Post Reply
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

[MFC] Cum detectez memory leaks?

Post by Ovidiu Cucu » 18 Jun 2011, 10:06

Intrebare
Cum detectez memory leaks intr-o aplicatie MFC?

Raspuns
Framework-ul MFC are support built-in pentru detectia de memory leaks.
Daca de exemplu avem urmatoarea implementare pentru clasa CFoo

Code: Select all

#include "StdAfx.h"
#include "Foo.h"

CFoo::CFoo()
{
   m_buffer = new char[128];
   strcpy(m_buffer, "Baba Safta");
}

CFoo::~CFoo()
{
}

Dupa ce se ruleaza apoi se inchide aplicatia, in fereastra Output/Debug apare:

Code: Select all

Detected memory leaks!
Dumping objects ->
{183} normal block at 0x0036B320, 128 bytes long.
 Data: <Baba Safta      > 42 61 62 61 20 53 61 66 74 61 00 CD CD CD CD CD 
Object dump complete.
The program '[1758] MyTest.exe: Native' has exited with code 0 (0x0).

Acuma stim ca exista memory leaks, cat de mari sunt ele si cam ce contin.
Totusi, in practica aceaste informatii nu sunt suficiente si se doreste sa se stie locul din codul sursa care le genereaza.
Pentru aceasta, se foloseste macro-ul DEBUG_NEW.

Code: Select all

#include "StdAfx.h"
#include "Foo.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CFoo::CFoo()
{
   m_buffer = new char[128]; // <-- double click in "Debug" window to go here!
   strcpy(m_buffer, "Baba Safta");
}

CFoo::~CFoo()
{
   // <-- should free the buffer to avoid memory leaks!
}
Dupa rulare in mod DEBUG, obtinem:

Code: Select all

Detected memory leaks!
Dumping objects ->
c:\Projects\Test\Foo.cpp(10) : {183} normal block at 0x0036B320, 128 bytes long.
 Data: <Baba Safta      > 42 61 62 61 20 53 61 66 74 61 00 CD CD CD CD CD 
Object dump complete.
The program '[3950] Test.exe: Native' has exited with code 0 (0x0).
A aparut in plus fisierul sursa (c:\Projects\Test\Foo.cpp) si linia (10) care a generat memory leaks.
Mai mult, dand un dublu-click in fereastra "Debug", VS-ul ne duce exact in acel fisier sursa, la acea linie.


Note
  • Acest topic descrie detectia de memory leaks aparute in urma alocarilor folosind operatorul new si nu a celor aparute in urma alocarilor cu functii CRT (malloc, calloc, etc) sau WinAPI (LocalAlloc, GlobalAlloc, etc).
  • ClassWizard pune automat define-ul pentru DEBUG_NEW dar nu intotdeauna, de aceea se recomanda sa se verifice ca toate fisierele de implementare (cpp) sa contina la inceput

    Code: Select all

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
  • In general, pentru detectia surselor de memory leaks, cele descrise mai de sus sunt suficiente.
    Totusi, pot apare cazuri mai dificile in care este necesara urmarirea alocarilor in mod dinamic. In aest scop, MFC-ul pune la dispozitie clasa CMemoryState.
  • In Visual C++ 6.0 este necesar ca in plus sa fie definit THIS_FILE.

    Code: Select all

    // Visual C++ 6.0
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
Vezi si << Back to MFC index



Post Reply