🎈 作者:Linux猿
🎈 簡介:CSDN博客專家🏆,C/C++、面試、刷題、演算法盡管咨詢我,關注我,有問題私聊!
🎈 關注專欄:C/C++面試通關集錦 (優質好文持續更新中……)🚀
目錄
一、什么是記憶體泄漏?
二、如何防止記憶體泄漏?
1. 成對出現
2. 智能指標
三、記憶體泄漏檢測工具
1. Valgrind
2. PurifyPlus
在寫 C/C++ 代碼的時候,經常需要為程式分配動態記憶體,難免就會發生記憶體泄漏的情況,本文就來說一下如何防止 C/C++ 記憶體泄漏!
在說防止記憶體泄漏前,先說一下什么是記憶體泄漏,
一、什么是記憶體泄漏?
通俗一點說就是,程式中動態分配的記憶體并沒有正確的釋放,
記憶體泄漏(Memory leak)是在計算機科學中,由于疏忽或錯誤造成程式未能釋放已經不再使用的記憶體,記憶體泄漏并非指記憶體在物理上的消失,而是應用程式分配某段記憶體后,由于設計錯誤,導致在釋放該段記憶體之前就失去了對該段記憶體的控制,從而造成了記憶體的浪費,
------ 維基百科
來看一個簡單的例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = (int*)malloc(sizeof(int));
*p = 10;
printf("*p = %d\n", *p);
p = (int*)malloc(sizeof(int));
*p = 20;
printf("*p = %d\n", *p);
free(p);
return 0;
}
輸出為:
*p = 10
*p = 20
在上述代碼中,先分配了 int 大小的記憶體空間給 p,然后再次分配了 int 大小的記憶體空間,這樣,第一次分配的記憶體空間沒有被釋放,且沒法參考了,這就會導致記憶體泄漏問題,
記憶體泄漏會導致系統中可用記憶體量減少,如果分配了過多的記憶體而沒有正確釋放,可能會導致系統或設備例外、降低計算機的性能,
二、如何防止記憶體泄漏?
1. 成對出現
new和delete ,malloc/calloc和free 應該成對出現,在編程中,可以在使用 new 分配記憶體后,先寫 delete 分配記憶體,然后在new 和 delete 之間寫其它的代碼,malloc/calloc 和 free 同理,
2. 智能指標
為了管理指標,在C++中引入了智能指標,包括:auto_ptr、unique_ptr、shared_ptr、weak_ptr,其中,auto_ptr在 C++11中已經被拋棄,
智能指標是用一個類來管理指標,通過解構式來釋放資源,這樣在一定程度上避免了記憶體泄漏問題,
下面來看一個例子:
#include <iostream>
#include <memory> //智能指標頭檔案
using namespace std;
int main() {
shared_ptr<int> ptr(new int(10));
cout<<"*ptr = "<<*ptr<<endl;
}
三、記憶體泄漏檢測工具
1. Valgrind
Valgrind 工具可以自動檢測許多記憶體管理和執行緒錯誤,可以詳細的分析程式,
Valgrind主要包括7個工具,一個記憶體錯誤檢測器、兩個執行緒錯誤檢測器、一個快取和分支預測分析器、一個呼叫圖生成快取和分支預測分析器,以及兩個不同的堆分析器,
作業系統:類Unix作業系統
2. PurifyPlus
PurifyPlus是一個運行時分析工具組件,可在程式運行時對其進行監控,
主要組件有:
Purify : 用于記憶體使用跟蹤和記憶體錯誤檢測;
Quantify : 用于性能分析、代碼流和執行緒可視化;
PureCoverage : 源代碼覆寫率分析;
作業系統:可以在 Windows、Linux、Solaris、AIX 等作業系統上使用;
🎈 歡迎小伙伴們點贊👍、收藏?、留言💬
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292017.html
標籤:其他
上一篇:不會吧不會吧,不會現在還有人不會整合redis和springboot吧!!!
下一篇:圖解 HTTP 連接管理
