欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

linux內(nèi)存泄露命令 linux內(nèi)存泄露如何查看和解決

如何在linux下檢測(cè)內(nèi)存泄漏

要想檢測(cè)內(nèi)存泄漏,就必須對(duì)程序中的內(nèi)存分配和釋放情況進(jìn)行記錄,所能夠采取的辦法就是重載所有形式的operator new 和 operator delete,截獲 new operator 和 delete operator 執(zhí)行過(guò)程中的內(nèi)存操作信息。下面列出的就是重載形式

十余年的鎮(zhèn)江網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷(xiāo)型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整鎮(zhèn)江建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“鎮(zhèn)江網(wǎng)站設(shè)計(jì)”,“鎮(zhèn)江網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

void* operator new( size_t nSize, char* pszFileName, int nLineNum )

void* operator new[]( size_t nSize, char* pszFileName, int nLineNum )

void operator delete( void *ptr )

void operator delete[]( void *ptr )

我們?yōu)?operator new 定義了一個(gè)新的版本,除了必須的 size_t nSize 參數(shù)外,還增加了文件名和行號(hào),這帶蠢里的文件名和行號(hào)就是這次 new operator 操作符被調(diào)用時(shí)所在的文件名和行號(hào),這個(gè)信息將在發(fā)現(xiàn)內(nèi)存泄漏時(shí)輸出,以幫助用戶(hù)定位泄漏具體位置。對(duì)于 operator delete,因?yàn)闊o(wú)法為之定義新的版本,我們直接覆蓋了全局的 operator delete 的兩個(gè)版本。

在重載的 operator new 函數(shù)版本中,我們將調(diào)用全局的 operator new 的相應(yīng)的版本并將相應(yīng)的 size_t 參數(shù)傳入,而后,我們將全局 operator new 返回的指針值以及該次分配所在的文件名和行號(hào)信息記錄下來(lái),這里所采用的數(shù)據(jù)結(jié)構(gòu)是一個(gè) STL 的 map,以指針值為 key 值。當(dāng) operator delete 被調(diào)用時(shí),如果調(diào)用方式正確的話(調(diào)用方式不正確的情況將在后面詳細(xì)描述),我們就能以傳入的指針值在 map 中找到相應(yīng)的數(shù)據(jù)項(xiàng)并將之刪除,而后調(diào)用 free 將指針?biāo)赶虻膬?nèi)存塊釋放。當(dāng)程序退出的時(shí)候,map 中的剩余的數(shù)據(jù)項(xiàng)就是我們企圖檢測(cè)的內(nèi)存泄漏信息--已經(jīng)在堆上分配但是尚未釋放的分配信息。

以上就是內(nèi)存檢測(cè)實(shí)現(xiàn)的基本原理,現(xiàn)在還有兩個(gè)基本問(wèn)題沒(méi)有解決:

1) 如何取得內(nèi)存分配代碼所在的文件名和行號(hào),并讓 new operator 將之傳遞給我們重載的 operator new。

2) 我們何時(shí)創(chuàng)建用于存儲(chǔ)內(nèi)存數(shù)據(jù)的 map 數(shù)據(jù)結(jié)構(gòu),如何管理,何時(shí)打印內(nèi)存泄漏信息。

先解決問(wèn)題1。首先我們可以利用 C 的預(yù)編譯宏 __FILE__ 和 __LINE__,這兩個(gè)宏將在編譯時(shí)在指定位置展開(kāi)為該文件的文件名和該行的行號(hào)。而或橋后我們需要將缺省的全局 new operator 替換為我們自定義的能夠傳入文件名和行號(hào)的版本,我們?cè)谧酉到y(tǒng)頭文件 MemRecord.h 中定義:

#define DEBUG_NEW new(__FILE__, __LINE__ )

而后在所有需要使用內(nèi)存檢測(cè)的客戶(hù)程序的所有的 cpp 文件的開(kāi)頭加入

#include "MemRecord.h"

#define new DEBUG_NEW

就可以將客戶(hù)源文件中的對(duì)于全局缺省的 new operator 的調(diào)用替換為衫行猛 new (__FILE__,__LINE__) 調(diào)用,而該形式的new operator將調(diào)用我們的operator new (size_t nSize, char* pszFileName, int nLineNum),其中 nSize 是由 new operator 計(jì)算并傳入的,而 new 調(diào)用點(diǎn)的文件名和行號(hào)是由我們自定義版本的 new operator 傳入的。我們建議在所有用戶(hù)自己的源代碼文件中都加入上述宏,如果有的文件中使用內(nèi)存檢測(cè)子系統(tǒng)而有的沒(méi)有,則子系統(tǒng)將可能因無(wú)法監(jiān)控整個(gè)系統(tǒng)而輸出一些泄漏警告。

再說(shuō)第二個(gè)問(wèn)題。我們用于管理客戶(hù)信息的這個(gè) map 必須在客戶(hù)程序第一次調(diào)用 new operator 或者 delete operator 之前被創(chuàng)建,而且在最后一個(gè) new operator 和 delete operator 調(diào)用之后進(jìn)行泄漏信息的打印,也就是說(shuō)它需要先于客戶(hù)程序而出生,而在客戶(hù)程序退出之后進(jìn)行分析。能夠包容客戶(hù)程序生命周期的確有一人--全局對(duì)象(appMemory)。我們可以設(shè)計(jì)一個(gè)類(lèi)來(lái)封裝這個(gè) map 以及這對(duì)它的插入刪除操作,然后構(gòu)造這個(gè)類(lèi)的一個(gè)全局對(duì)象(appMemory),在全局對(duì)象(appMemory)的構(gòu)造函數(shù)中創(chuàng)建并初始化這個(gè)數(shù)據(jù)結(jié)構(gòu),而在其析構(gòu)函數(shù)中對(duì)數(shù)據(jù)結(jié)構(gòu)中剩余數(shù)據(jù)進(jìn)行分析和輸出。Operator new 中將調(diào)用這個(gè)全局對(duì)象(appMemory)的 insert 接口將指針、文件名、行號(hào)、內(nèi)存塊大小等信息以指針值為 key 記錄到 map 中,在 operator delete 中調(diào)用 erase 接口將對(duì)應(yīng)指針值的 map 中的數(shù)據(jù)項(xiàng)刪除,注意不要忘了對(duì) map 的訪問(wèn)需要進(jìn)行互斥同步,因?yàn)橥粫r(shí)間可能會(huì)有多個(gè)線程進(jìn)行堆上的內(nèi)存操作。

好啦,內(nèi)存檢測(cè)的基本功能已經(jīng)具備了。但是不要忘了,我們?yōu)榱藱z測(cè)內(nèi)存泄漏,在全局的 operator new 增加了一層間接性,同時(shí)為了保證對(duì)數(shù)據(jù)結(jié)構(gòu)的安全訪問(wèn)增加了互斥,這些都會(huì)降低程序運(yùn)行的效率。因此我們需要讓用戶(hù)能夠方便的 enable 和 disable 這個(gè)內(nèi)存檢測(cè)功能,畢竟內(nèi)存泄漏的檢測(cè)應(yīng)該在程序的調(diào)試和測(cè)試階段完成。我們可以使用條件編譯的特性,在用戶(hù)被檢測(cè)文件中使用如下宏定義:

#include "MemRecord.h"

#if defined( MEM_DEBUG )

#define new DEBUG_NEW

#endif

當(dāng)用戶(hù)需要使用內(nèi)存檢測(cè)時(shí),可以使用如下命令對(duì)被檢測(cè)文件進(jìn)行編譯

g++ -c -DMEM_DEBUG xxxxxx.cpp

就可以 enable 內(nèi)存檢測(cè)功能,而用戶(hù)程序正式發(fā)布時(shí),可以去掉 -DMEM_DEBUG 編譯開(kāi)關(guān)來(lái) disable 內(nèi)存檢測(cè)功能,消除內(nèi)存檢測(cè)帶來(lái)的效率影響。

網(wǎng)頁(yè)題目:linux內(nèi)存泄露命令 linux內(nèi)存泄露如何查看和解決
網(wǎng)站URL:http://chinadenli.net/article3/dsppsos.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)小程序開(kāi)發(fā)外貿(mào)網(wǎng)站建設(shè)商城網(wǎng)站建站公司標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管