[ boccio @ 20.09.2003. 12:47 ] @
S obzirom da je ovo jedna od glavnih glavobolja svakog c++ programera, evo jedan mali snipet koda koji (mozda) moze biti od pomoci u detekciji istoga. Ako neko ima slicne primere ili savete za otklanjanje, ne bi bilo lose da ih ovde okupimo...

Code:

#include "crtdbg.h"

class FindMemoryLeaks
{
_CrtMemState m_checkpoint;

public:

FindMemoryLeaks()
{
_CrtMemCheckpoint(&m_checkpoint);
};

~FindMemoryLeaks()
{
_CrtMemState checkpoint;
_CrtMemCheckpoint(&checkpoint);
_CrtMemState diff;
_CrtMemDifference(&diff, &m_checkpoint, &checkpoint);
_CrtMemDumpStatistics(&diff);
_CrtMemDumpAllObjectsSince(&diff);
};
};


deklarisite nesto tipa FindMemoryLeaks leaks; u glavnom cpp fajlu i pustite debug run, nakon cega ce debug window sadrzati informacije o (eventualnim) curenjima...
[ Dragi Tata @ 20.09.2003. 16:02 ] @
Curenje memorije je u praksi jako naduvan problem. Čak i relativni početnik može lako da ih izbegne ako je iole disciplinovan, a posebno ako koristi std::vector umesto dinamičkih nizova i "pametne pointere" umesto "sirovih".

Doduše tačno je da ih je ponekad teško naći ako se već pojave.
[ sspasic @ 20.09.2003. 19:14 ] @
Citat:
Dragi Tata:
Doduše tačno je da ih je ponekad teško naći ako se već pojave.


A ako se pojave:
http://www.codeproject.com/tools/leakfinder.asp

Prilicno upotrebljiva stvar.

Inace, Boehm GC (vec spominjan ovde) takodje moze da se koristi za detekciju curenja memorije, ali ako koristite MS VC++ leakfinder ume da bude bas od pomoci.

Iskreno, meni se vise puta desavalo da imam ovaj problem, ali obicno ne u kodu koji sam sam pisao, posto se tu trudim da maksimalno koristim one boost::smart_ptr ili std::auto_ptr, ali u third party bibliotekama koje su pisane u C-u i koje ponekad zbog slabe dokumentacije ne koristim na pravi nacin...
[ leka @ 20.09.2003. 19:26 ] @
Za detekcije curenja memorije treba koristiti programe koji su specijalizovani za to - Valgrind, Checked, Code Guard (i slicno)... Naravno, mogu da se koriste i neke implementacije garbage collector-a kao sto rece sspasic...
[ Dragi Tata @ 20.09.2003. 20:28 ] @
Citat:
sspasic:
one boost::smart_ptr ili std::auto_ptr


Ovo je siguran sam lapsus, ali za one koji ne znaju, nije boost::smart_ptr, već boos::shared_ptr ili boost::scoped_ptr. Oba su odlična, ali moj favorit je Loki::SmartPtr. Što se tiče std::auto_ptr, bolje je uopšte da se ne koristi ako ne znate tačno šta radite. Više o njemu:

http://www.gotw.ca/publications/using_auto_ptr_effectively.htm