内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Linux下內(nèi)存問題檢測神器Valgrind怎么用

Linux下內(nèi)存問題檢測神器Valgrind怎么用,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

豐潤網(wǎng)站建設公司創(chuàng)新互聯(lián)建站,豐潤網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為豐潤上千多家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設公司要多少錢,請找那個售后服務好的豐潤做網(wǎng)站的公司定做!

在寫大型C/C++工程時難免會發(fā)生內(nèi)存泄漏現(xiàn)象,系統(tǒng)編程中一個重要的方面就是有效地處理與內(nèi)存相關的問題。你的工作越接近系統(tǒng),你就需要面對越多的內(nèi)存問題。有時這些問題非?,嵥椋鄷r候它會演變成一個調(diào)試內(nèi)存問題的惡夢。 常見的內(nèi)存問題一共七種:1. 動態(tài)內(nèi)存泄露;2. 資源泄露,比如文件指針不關閉;3. 動態(tài)內(nèi)存越界;4.數(shù)組內(nèi)存越界;5.動態(tài)內(nèi)存double free;6.使用野指針,即未初始化的指針;7.釋放野指針,即未初始化的指針。

內(nèi)存問題非常難定位,對于小工程來說,簡單去檢查代碼中new和delete的匹配對數(shù)就基本能定位到問題,但是一旦代碼量上升到以萬單位時,僅靠肉眼檢查來定位問題那就非常困難了,所以我們需要利用工具幫助我們找出問題所在。在Linux系統(tǒng)下內(nèi)存檢測工具首推Valgrind,一款非常好用的開源內(nèi)存管理框架。Valgrind其實是一個工具集,內(nèi)存錯誤檢測只是它眾多功能的一個,但我們用得最多的功能正是它——memcheck。

該工具可以檢測下列與內(nèi)存相關的問題 :

  • 未釋放內(nèi)存的使用

  • 對釋放后內(nèi)存的讀/寫

  • 對已分配內(nèi)存塊尾部的讀/寫

  • 內(nèi)存泄露

  • 不匹配的使用malloc/new/new[] 和 free/delete/delete[]

  • 重復釋放內(nèi)存

首先安裝Valgrind非常簡單:

//valgrind下載:
http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2

valgrind安裝:1. tar -jxvf valgrind-3.12.0.tar.bz22. cd valgrind-3.12.03. ./configure4. make5. sudo make install

下面開始講解Valgrind的應用場景。

注意: 下面討論的所有測試代碼都應該使用gcc/g++并且加上-g選項。

1. 使用未初始化的內(nèi)存(使用野指針)

這里我們定義了一個指針p,但并未給他開辟空間,即他是一個野指針,但我們卻使用它了。

Linux下內(nèi)存問題檢測神器Valgrind怎么用

Valgrind檢測出我們程序使用了未初始化的變量,但并未檢測出內(nèi)存泄漏。

Linux下內(nèi)存問題檢測神器Valgrind怎么用

2.在內(nèi)存被釋放后進行讀/寫(使用野指針)

p所指向的內(nèi)存被釋放了,p變成了野指針,但是我們卻繼續(xù)使用這片內(nèi)存。

Linux下內(nèi)存問題檢測神器Valgrind怎么用

Valgrind檢測出我們使用了已經(jīng)free掉的內(nèi)存,并給出這片內(nèi)存是哪里分配哪里釋放的。

Linux下內(nèi)存問題檢測神器Valgrind怎么用

3.從已分配內(nèi)存塊的尾部進行讀/寫(動態(tài)內(nèi)存越界)

我們動態(tài)地分配了一段數(shù)組,但我們在訪問個數(shù)組時發(fā)生了越界讀寫,程序crash掉。

Linux下內(nèi)存問題檢測神器Valgrind怎么用

Valgrind檢測出越界的位置。

Linux下內(nèi)存問題檢測神器Valgrind怎么用

注意:Valgrind不檢查靜態(tài)分配數(shù)組的使用情況!所以對靜態(tài)分配的數(shù)組,Valgrind表示無能為力!比如下面的例子,程序crash掉,我們卻不知道為什么。

Linux下內(nèi)存問題檢測神器Valgrind怎么用

Linux下內(nèi)存問題檢測神器Valgrind怎么用

4.內(nèi)存泄漏

內(nèi)存泄漏的原因在于沒有成對地使用malloc/free和new/delete,比如下面的例子。

Linux下內(nèi)存問題檢測神器Valgrind怎么用

Valgrind會給出程序中malloc和free的出現(xiàn)次數(shù)以判斷是否發(fā)生內(nèi)存泄漏,比如對上面的程序運行memcheck,Valgrind的記錄顯示上面的程序用了1次malloc,卻調(diào)用了0次free,明顯發(fā)生了內(nèi)存泄漏!

Linux下內(nèi)存問題檢測神器Valgrind怎么用

上面提示了我們可以使用--leak-check=full進一步獲取內(nèi)存泄漏的信息,比如malloc和free的具體行號。

Linux下內(nèi)存問題檢測神器Valgrind怎么用

5. 不匹配地使用malloc/new/new[] 和 free/delete/delete[]

正常使用new/delete和malloc/free是這樣子的:

Linux下內(nèi)存問題檢測神器Valgrind怎么用

Linux下內(nèi)存問題檢測神器Valgrind怎么用

而不匹配地使用malloc/new/new[] 和 free/delete/delete[]則會被提示mismacth:

Linux下內(nèi)存問題檢測神器Valgrind怎么用

Linux下內(nèi)存問題檢測神器Valgrind怎么用

6.兩次釋放內(nèi)存

double free的情況同樣是根據(jù)malloc/free的匹配對數(shù)來體現(xiàn)的,比如free多了一次,Valgrind也會提示。

Linux下內(nèi)存問題檢測神器Valgrind怎么用

Linux下內(nèi)存問題檢測神器Valgrind怎么用

當然,Valgrind也不是萬能的。Valgrind也有無法找到問題的時候,有些問題只能通過不斷的review代碼找到了癥結。發(fā)現(xiàn)問題,解決問題,畢竟是末流。最好的方法,就是不引入內(nèi)存問題。這可以通過良好的代碼風格和設計來實現(xiàn)的。

關于Linux下內(nèi)存問題檢測神器Valgrind怎么用問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關知識。

文章題目:Linux下內(nèi)存問題檢測神器Valgrind怎么用
本文路徑:http://www.rwnh.cn/article20/jddpco.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站導航、外貿(mào)網(wǎng)站建設網(wǎng)站設計、網(wǎng)頁設計公司、營銷型網(wǎng)站建設

廣告

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

營銷型網(wǎng)站建設
西畴县| 马山县| 金川县| 安陆市| 腾冲县| 江源县| 南投市| 沂源县| 健康| 靖远县| 古蔺县| 龙门县| 神池县| 海盐县| 光山县| 雷波县| 金门县| 当雄县| 共和县| 柞水县| 仁布县| 平乡县| 平顺县| 万山特区| 怀仁县| 陆良县| 新建县| 三门峡市| 贺州市| 临湘市| 武鸣县| 汕头市| 德昌县| 曲靖市| 海原县| 德清县| 淄博市| 西华县| 罗江县| 松原市| 灵武市|