青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

自己寫內存泄露檢測庫

author: kevin lynx

這個內存泄露工具最基本的原理就是利用宏替換掉標準的malloc、free(暫不考慮其他內存分配函數,
如realloc、strdup),記錄下每次內存分配和釋放動作。因為宏的處理發生在預處理階段,所以可以
很容易地用你自己的malloc函數替換掉標準的malloc。例如:

/* lib.h */
#define malloc my_malloc
#define free my_free 

/* lib.c */
/* disable these macro in this compile unit */
#undef malloc
#undef free 

static int count = 0

void *my_malloc( size_t size )
{
    
++count;
    
return malloc( size );
}
 

void my_free( void *a )
{
    
--count;
    free( a );
}
 


要使用以上代碼,用戶在使用時就需要包含lib.h,從而可以使用宏將用戶自己寫的malloc替換
為my_mallo。當程序退出時,如果count大于0,那么可以肯定的是有內存泄露。當然,如果
count為負數,則很可能對同一個指針進行多次free。

但是以上代碼的功能太局限了。一個真正的內存泄露檢測庫(工具),至少需要報告泄露的代碼
文件、函數、行數等信息。當然,如果能報告調用堆棧,就更好了。不過這就依賴于具體的平臺,
需要使用特定的系統接口才可以獲取出。

要實現以上功能也很簡單,只需要在每次調用malloc的時候,通過編譯器預定義宏__FILE__、
__LINE__、__FUNCTION__(__func__)就可以得到文件名、函數、行號等信息。將這些信息保存
起來,然后在free的時候移除相應的信息即可。

最簡單的實現方式,就是保存一個表,表里記錄著每次分配內存的信息:

 

struct memRecord
{
    
char file[MAX_FILE_NAME];
    
char func[MAX_FUNC_NAME];
    size_t lineno;
    
void *address;
    size_t size;
}


struct memRecord mem_record[MAX_RECORD]; 

 

但是,通過單單一個free函數的void*參數,如何獲取出對應的分配記錄呢?難道:

for( size_t i = 0; i < MAX_RECORD; ++ i )
{
    
if( address == mem_record[i].address ) 
    
{
        
/* shit */
    }

}
 

 

雖然可行,但是很stupid。這里提供一個小技巧:

 

void *my_malloc( size_t size )
{
    
void *= malloc( size + sizeof( size_t ) );
    
return (char*)a + sizeof( size_t );
}
 

void my_free( void *a )
{
    
/* actually, 'a' is not the real address */
    
char *= ((char*)a - sizeof( size_t ) );    
    free( p );
}

 

意思就是說,我多分配了4字節內存(sizeof( size_t ) ),用于保存這次分配記錄在mem_record
中被保存的索引。在釋放內存的時候,通過一些地址偏移計算,就可以獲取出真正的系統malloc
返回的地址,從而安全釋放(別給我說這里的計算存在平臺和編譯器的限制,沒認真看文章的SB才說)。

另一個問題是,我們如何處理每次分配釋放時,對于分配記錄那個數據結構,也就是mem_record。
每一次free的時候,移除的記錄可能位于mem_record的任何位置。一定時間后,mem_record內部
將出現很多漏洞(已經沒用的數組位置)。解決這個問題最直接當然還是最stupid的方法,就是每次
free移除記錄時重新整理一遍mem_record。如果你這樣做了,那你的malloc/free比微軟的還慢。

我的解決方法是:
size_t free_index[MAX_RECORD];
用于保存這些出現漏洞的index。每一次free移除記錄時,就把這個記錄對應的inex保存進來,表示
這個index指向的mem_record[]可用。每一次malloc的時候,先從這里取index,如果這里沒有,那
可以直接從mem_record的末尾取。

具體細節就不闡述了,典型的空間換時間方法。整個庫很簡單,代碼100來行。我也只進行過粗略的
測試。我肯定這100來行代碼是有問題的,相信自己的代碼存在問題是對bug的一種覺悟,哈哈哈。

這個東西只檢測C語言的內存泄露,其實要檢測C++的也很簡單,只需要重載new和delete就可以了。

要放春節假了,在公司的最后幾個小時實在無聊,才做了這個東西,前后花了1個多小時,寫起來感覺
不錯。

 

 

代碼下載

 

posted on 2009-01-23 17:43 Kevin Lynx 閱讀(4420) 評論(5)  編輯 收藏 引用 所屬分類: c/c++

評論

# re: 自己寫內存泄露檢測庫 2009-01-23 22:53 jims

本人一直博主學習  回復  更多評論   

# re: 自己寫內存泄露檢測庫 2009-01-23 23:04 adon

char *str = (char*) malloc( 100 );
char *str2 = (char*) malloc( 111 );
str = str2;
free(str);
free(str);
getchar();

Memory leak report by cmlc, a tiny c memory leak checking library.
Detected 0 memory leaks.

似乎在free上出了點問題  回復  更多評論   

# re: 自己寫內存泄露檢測庫 2009-01-23 23:28 adon

static void cmlc_remove_record( size_t index )
{
if( fi_tail < MAX_RECORD - 1 )
{
free_index[fi_tail++] = index;
free(mem_record[index].address);
mem_record[index].address = 0; /* to identify this record has been removed */
}
}

void cmlc_free( void *address )
{
struct memory *mem = (struct memory*)( (char*)address - sizeof( size_t ) );
cmlc_remove_record( mem->index );
// free( mem ); //注釋的free,移到cmlc_remove_record中
}  回復  更多評論   

# re: 自己寫內存泄露檢測庫 2009-01-23 23:55 萬連文

需要考慮多線程,否則太不安全了,沒有實際意義。  回復  更多評論   

# re: 自己寫內存泄露檢測庫 2009-01-24 20:55 陳梓瀚(vczh)

微軟的編譯器僅需在cpp開始的地方:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

當你認為東西都是放完了以后調用
_CrtDumpMemoryLeaks();

東西就回到output窗口去了。  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩国产成人在线| 国产精自产拍久久久久久| 国产手机视频一区二区| 亚洲欧美日韩综合aⅴ视频| av成人激情| 国产精品大片免费观看| 亚洲一区精彩视频| 亚洲专区欧美专区| 狠狠色丁香久久婷婷综合_中| 玖玖玖免费嫩草在线影院一区| 久久在精品线影院精品国产| 亚洲国产精品一区制服丝袜| 欧美电影资源| 欧美三级网址| 久久久久网站| 欧美精品午夜视频| 欧美一区二区视频在线观看2020| 久久国产夜色精品鲁鲁99| 亚洲欧洲精品一区| 一区二区三区免费在线观看| 国产日韩欧美亚洲| 亚洲国产高清在线| 欧美色另类天堂2015| 久久婷婷麻豆| 欧美日韩国产色站一区二区三区| 性做久久久久久久免费看| 久久九九全国免费精品观看| 99成人在线| 欧美淫片网站| 亚洲一区二区三区四区在线观看 | 亚洲伦理在线免费看| 日韩午夜激情av| 一区在线电影| 夜夜嗨av色一区二区不卡| 韩国成人精品a∨在线观看| 亚洲精品欧洲| 黄网站色欧美视频| 亚洲无限av看| 亚洲六月丁香色婷婷综合久久| 亚洲欧美在线aaa| 一区二区电影免费在线观看| 久久精品女人| 亚洲欧美一区二区原创| 欧美黄色小视频| 美日韩在线观看| 国产情侣久久| 亚洲最新在线视频| 亚洲精品一区二| 久久国产精品99精品国产| 亚洲综合日韩在线| 欧美精品一区二区三区四区| 美女主播一区| 黄色成人在线网址| 亚洲一区二区在线播放| 在线亚洲欧美视频| 欧美精品情趣视频| 91久久在线观看| 亚洲激情精品| 免费高清在线一区| 久热成人在线视频| 激情欧美一区| 久久免费视频这里只有精品| 久久久久国产一区二区三区| 国产伦精品一区二区三区在线观看| 亚洲人屁股眼子交8| 亚洲人成网站在线播| 久热精品视频在线观看| 欧美va亚洲va日韩∨a综合色| 国产综合色产| 久久精品视频免费| 蜜臀久久99精品久久久画质超高清| 国产亚洲欧洲997久久综合| 性欧美精品高清| 久久在线视频| 亚洲第一黄色网| 欧美va亚洲va香蕉在线| 亚洲三级视频在线观看| 亚洲精品在线二区| 欧美日韩久久| 亚洲欧美www| 久久久久久久精| 在线不卡免费欧美| 欧美福利在线观看| 在线视频欧美一区| 欧美一级视频精品观看| 国产啪精品视频| 久久婷婷麻豆| 亚洲乱码国产乱码精品精98午夜 | 亚洲国产精品va在线观看黑人| 蜜臀av性久久久久蜜臀aⅴ| 亚洲国产日本| 香蕉精品999视频一区二区| 国产精一区二区三区| 久久福利电影| 最新国产乱人伦偷精品免费网站| 亚洲校园激情| 精品成人久久| 欧美日韩一区二区免费在线观看| 亚洲一二区在线| 免费久久99精品国产自| 日韩视频一区二区在线观看| 国产精品一区二区三区观看| 浪潮色综合久久天堂| 一个色综合av| 免费久久99精品国产| 亚洲综合国产| 在线精品福利| 国产精品毛片| 免费毛片一区二区三区久久久| 一区二区三区蜜桃网| 久久天天躁夜夜躁狠狠躁2022| 99re6这里只有精品视频在线观看| 国产精品视频一区二区高潮| 美日韩精品视频免费看| 亚洲私人影院在线观看| 欧美大片在线观看| 欧美一区二区三区在线视频| 日韩午夜在线播放| 娇妻被交换粗又大又硬视频欧美| 欧美日韩在线免费观看| 欧美v国产在线一区二区三区| 亚洲综合不卡| 夜夜嗨av色一区二区不卡| 欧美国产精品人人做人人爱| 翔田千里一区二区| 日韩视频在线观看一区二区| 一区二区在线不卡| 国产又爽又黄的激情精品视频 | 欧美一级夜夜爽| 亚洲一卡二卡三卡四卡五卡| 亚洲精品久久久久| 欧美电影免费观看高清完整版| 久久国产手机看片| 香蕉成人久久| 午夜久久久久| 亚洲欧美在线播放| 中文av字幕一区| 在线视频亚洲| 亚洲深夜av| 亚洲色图制服丝袜| 99视频有精品| 亚洲午夜一区二区三区| 亚洲视频精选在线| 一区二区三区四区国产| 一本色道久久| 亚洲欧美国产视频| 亚洲欧美日韩精品久久亚洲区| 亚洲视频中文字幕| 亚洲一区二区三区精品在线| 亚洲午夜视频在线观看| 一区二区三区产品免费精品久久75 | 久久国产日本精品| 久久嫩草精品久久久久| 老司机成人网| 欧美精品一区二区三区久久久竹菊| 欧美成年人在线观看| 欧美大秀在线观看| 欧美日韩在线免费视频| 国产精品乱码久久久久久| 国产精品日本一区二区| 国产日韩精品在线播放| 国内激情久久| 亚洲黄色影片| 制服丝袜激情欧洲亚洲| 亚洲综合清纯丝袜自拍| 欧美在线观看网站| 久久久精品性| 亚洲高清不卡在线| 中日韩男男gay无套| 亚洲欧美福利一区二区| 久久精品国产99| 欧美va日韩va| 国产精品视频99| 在线观看精品一区| 夜色激情一区二区| 欧美一级视频精品观看| 久久久亚洲国产美女国产盗摄| 亚洲国产毛片完整版| 亚洲午夜精品久久久久久浪潮| 久久久99国产精品免费| 你懂的视频一区二区| 国产精品―色哟哟| 亚洲电影观看| 亚洲免费视频观看| 欧美成人精品一区二区| 亚洲最新在线| 免费成年人欧美视频| 国产精品国产馆在线真实露脸| 狠狠色丁香久久婷婷综合丁香| 一本色道久久综合狠狠躁的推荐| 欧美一区二区视频免费观看| 欧美国产日韩一二三区| 亚洲一区二区三区激情| 久久亚洲影音av资源网| 国产欧美欧洲在线观看| 日韩视频在线免费观看| 久久久免费观看视频| 亚洲网站在线播放| 欧美激情综合在线| 亚洲电影在线观看|