在c/c++中指標給編碼帶來的極大的方便,但是同時由於分配的指標需要程式設計人員自行釋放記憶體,因此容易造成記憶體洩漏,c++中自帶的new/delete本身沒有提供記憶體洩漏檢測的功能,不過我們可以過載這兩個函式來追蹤記憶體的分配和釋放,以此來檢測程式是否出現了記憶體洩漏。演算法的思想是在new一塊記憶體時將該塊記憶體的位址以及出現的檔案和行號資訊記錄到乙個map資料結構中,以記憶體位址作為key。釋放該記憶體時將map中的該記錄刪除,最後程式退出時從map結構中輸出那些沒有被釋放的記憶體資訊。看下面一**。
#include #include #include #include #include #include using namespace std;
class tracer
entry ()
: _file (0), _line (0)
{}char const * file () const
int line () const
private:
char const * _file;
int _line;
};class lock
~lock ()
private:
tracer & _tracer;
};public:
tracer ();
~tracer ();
void add (void * p, char const * file, int line);
void remove (void * p);
void dump ();
static bool ready;
private:
void lock ()
void unlock ()
private:
typedef std::map::iterator iterator;
std::map_map;
int _lockcount;
};bool tracer::ready = false;
tracer::tracer():_lockcount(0)
tracer::~tracer()
void tracer::dump()
}}void tracer::add(void *p, const char *file, int line)
void tracer::remove(void *p)
/*extern*/ tracer gnewtracer;
void* operator new (size_t size, const char* file, int line)
void operator delete(void* p, const char* file, int line)
void* operator new (size_t size)
void operator delete(void* p)
void* operator new (size_t size, const char* file, int line)
void operator delete(void* p, const char* file, int line)
{ if (tracer::ready)
gnewtracer.remove(p);
cout <<"delete(void* p, const char* file, int line)" 《上面**的輸出是
2 memory leaks detected
leak.cpp, 181
leak.cpp, 182
即在leak.cpp檔案中的181行和182行出現了記憶體洩漏。
過載new和delete來檢測記憶體洩漏
1.簡述 2.基本原理 記憶體洩漏就是new出來的記憶體沒有通過delete合理的釋放掉。new和delete這兩個函式就是關鍵點。可以過載new和delete,每次new中開闢一塊記憶體就用鍊錶把這個記憶體的資訊儲存下來,每次用delete刪除一塊記憶體就從鍊錶中刪除這塊記憶體的記錄。3.樣例 輸...
過載C 的new和delete
過載c c 標準庫的記憶體管理函式 比如malloc,free,operator new,operator delete,operator new,operator delete 時,編譯器會忽視重定義,所以不用擔心鏈結時會產生重定義錯誤。operator new,operator delete,o...
new與delete的過載
include stdafx.h include using namespace std include include new 和delete的過載 new new delete delete 適用於極個別情況需要定製的時候才用的到。一般很少用 宣告可以不加 引數 void operator ne...