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