翻譯|行業(yè)資訊|編輯:胡濤|2023-09-08 13:35:49.120|閱讀 108 次
概述:本文中,您可以學(xué)習(xí)如何借助運行時錯誤檢測工具查找C和C++應(yīng)用程序中的內(nèi)存泄漏~
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
編程軟件中的內(nèi)存泄漏可能很難精確定位,因為這里面有大量的數(shù)據(jù)。本文中,您可以學(xué)習(xí)如何借助運行時錯誤檢測工具查找C和C++應(yīng)用程序中的內(nèi)存泄漏。
當(dāng)您面臨內(nèi)存泄漏時,C++和C有一套運行時檢測工具,這些工具有助于提高性能。對于那些經(jīng)常使用C或C++編寫代碼的人來說,內(nèi)存泄漏已經(jīng)見怪不怪。維基百科中對于內(nèi)存泄漏的定義如下:
在計算機科學(xué)中,內(nèi)存泄漏是一種資源泄漏,當(dāng)計算機程序錯誤地管理內(nèi)存分配,導(dǎo)致不再需要的內(nèi)存無法釋放時,就會發(fā)生這種情況。當(dāng)對象存儲在內(nèi)存中但運行的代碼無法訪問時,也可能發(fā)生內(nèi)存泄漏。
以下顯示的運行“Hello world”的程序是這種行為的最佳示例之一。
如果我們使用以下參數(shù)執(zhí)行此程序:
如果我們在第25行檢查程序的狀態(tài),就在第二次執(zhí)行對malloc的調(diào)用之前,我們觀察到:
到目前為止,變量字符串指向字符串“hello”,該字符串是上一次循環(huán)迭代的結(jié)果。
變量字符串指向在該循環(huán)迭代中分配的擴展字符串“hello-this”。
這些賦值示意圖如下;這兩個變量都指向動態(tài)分配的內(nèi)存塊。
下一句話:
將創(chuàng)建指向較長內(nèi)存塊的兩個變量,如下所示:
然而,一旦發(fā)生這種情況,就沒有剩余的指針指向較短的塊。即使您愿意,也不可能回收先前由string_so_far指向的內(nèi)存;它現(xiàn)在被永久分配。這被稱為“內(nèi)存泄漏”。C++和C經(jīng)常面臨這些常見問題,因此盡早發(fā)現(xiàn)它們很重要。
雖然沒有“檢測內(nèi)存泄漏”按鈕,但C++和C有運行時檢測工具可以提供幫助。這種類型的錯誤可以通過內(nèi)存錯誤檢測工具進行診斷,如Parasoft Insure++。如下所示:
此示例被稱為LEAK_SSIGN,因為它是在重新分配指針時引起的。(附言:其他內(nèi)存調(diào)試器通常不會區(qū)分未處理內(nèi)存和實際泄漏內(nèi)存,但Insure++會區(qū)分。)在這種情況下,未處理內(nèi)存不是優(yōu)質(zhì)的內(nèi)存,而是你沒有釋放的內(nèi)存,與實際泄漏不同,實際泄漏是你無法釋放的內(nèi)存。
Parasoft Insure++還可以自動檢測其他幾種類型的泄漏。
泄露種類 | 描述 |
LEAK_FREE | 在釋放一個包含指向其他內(nèi)存塊的指針的內(nèi)存塊時發(fā)生。 |
LEAK_RETURN | 當(dāng)函數(shù)返回指向已分配內(nèi)存塊的指針,但返回的值在調(diào)用例程中被忽略時發(fā)生。 |
LEAK_SCOPE | 當(dāng)函數(shù)包含指向內(nèi)存塊的局部變量,但函數(shù)返回時沒有將指針保存在全局變量中或?qū)⑵鋫鬟f回調(diào)用方時發(fā)生。 |
請注意,錯誤消息指出了問題發(fā)生的確切源行,而不僅僅是塊的分配位置,這是查找和修復(fù)內(nèi)存泄漏的關(guān)鍵問題。這一點非常重要,因為在應(yīng)用程序中引入細(xì)微的內(nèi)存泄漏很容易,但很難全部找到。
了解更多有關(guān)Parasoft產(chǎn)品咨詢,歡迎咨詢
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn