无码人妻熟妇av又粗又大|欧美自拍手机在线不卡视频|一二区视频精华99|偷拍与自拍五月天1024|久草资源免费网站|久 在线视频 v|欧美视频葡京理论片一区二区|萱萱影视影音先锋|性xx.日韩免费|五月丁香久久婷婷

如何查找內(nèi)存泄露

更新時間:2016-03-22本文內(nèi)容轉(zhuǎn)載自互聯(lián)網(wǎng)
這兩天,在查找內(nèi)存泄露的問題。因為內(nèi)存都是放在memory pool里,所以不能通過valgrind等工具抓到那個地方分配的內(nèi)存沒有手動被釋放。使用gcc,有一個方法去打包內(nèi)存分配函數(shù),而且不需要編輯已有的code并且不需要修改目標(biāo)文件。linker ld 提供了一個內(nèi)建的選項去替換函數(shù)符號。 –wrap一個橫線 表示把函數(shù) func 替換為兩個下劃線前綴__wrap_func ??梢酝ㄟ^這個選項傳給gcc去做恰當(dāng)?shù)逆溄?。舉個例子來說明吧。 如果最后的free函數(shù)被注釋掉,那么p就會出現(xiàn)內(nèi)存泄漏,如果calloc已經(jīng)被打包把內(nèi)存放到memory pool里,程序退出激活釋放memory pool的話。那么在程序為退出之前,那些mem還是存在的,因此當(dāng)前進(jìn)程會暫用很多內(nèi)存如果很多分配沒有free的話 view plaincopy to clipboard#include using namespace std; int main { int allocTimes = 100; whileallocTimes-- { int *p = int*calloc5, sizeofint; //freep; } } 怎樣來檢查這些分配沒釋放的內(nèi)存呢。就可以使用上面說的,定義一些函數(shù),然后通過編譯器傳給連接器去替換函數(shù)。把這些函數(shù)定義在一個文件中test.h:view plaincopy to clipboard#ifndef TEST_INC #define TEST_INC #include using namespace std; #ifdef __cplusplus extern "C" { #endif extern void *__real_callocsize_t nmemb, size_t size; extern void *__real_reallocvoid *ptr, size_t size; extern void *__real_mallocsize_t size; extern void __real_freevoid *ptr; void *__wrap_callocsize_t numemb, size_t size; void *__wrap_reallocvoid *ptr, size_t size; void *__wrap_mallocsize_t size; void __wrap_freevoid *ptr; /* wrap calloc */ void * __wrap_callocsize_t numemb, size_t size { cout << "wrap alloc" << endl; return __real_callocnumemb, size; } /* wrap realloc */ void * __wrap_reallocvoid *ptr, size_t size { cout << "wrap realloc" << endl; return void*__real_reallocptr, size; } /* wrap malloc */ void * __wrap_mallocsize_t size { cout << "wrap malloc" << endl; return void*__real_mallocsize; } /* wrap malloc */ void __wrap_freevoid *p { cout << "wrap free" << endl; __real_freep; } #ifdef __cplusplus }; /* end of extern "C" */ #endif #endif /* ----- #ifndef TEST_INC ----- */ .cpp只需要加上這個頭文件view plaincopy to clipboard#include using namespace std; #include "test.h" int main { int allocTimes = 100; whileallocTimes-- { int *p = int*calloc5, sizeofint; //freep; } } 然后在Makefile加上編譯選項CFLAGS = -g -O0 -Wall -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc -Wl,--wrap,realloc 或者g++ test.cc -o test -g -O0 -Wall -Wl,--wrap,calloc -Wl,--wrap,free -Wl,-wrap,malloc -Wl,-wrap,realloc 去編譯一個文件執(zhí)行./test 即可發(fā)現(xiàn)alloc 和 free不匹配。此方法只是拋磚引玉。
有用 0 無用 0 我要提問