您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++常見的內存泄漏有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++常見的內存泄漏有哪些”吧!
1. C++或者C 中沒有調用匹配的 malloc free new delete 導致內存泄漏 這是最根本原因。 構造函數new 了 記得析構函數delete
2. 有時 申請的是int * p =new int[10]; 釋放時 delete p; 正確的應該是delete [] p; 或者存在嵌套new 我們只delete 了最外層的
3. 有時候系統崩潰了會無法調用析構函數 因此導致內存泄漏 由此引入了auto_ptr 智能指針
4.有時我們new了 內存 用到了拷貝構造函數 由于默認拷貝構造函數是淺拷貝 在析構時出現了 同一資源的重復釋放delete 出錯 注意 深拷貝
5.沒有將基類析構函數寫成virtual 類型 也會導致 內存泄漏
野指針
1.指針初始化沒賦值
2. 指針delete后沒有置空 NULL 使得指針指向垃圾內存
3.指針操作超過自己該有的權限 越權 段錯誤
1. 在類的構造函數和析構函數中沒有匹配的調用new和delete函數
兩種情況下會出現這種內存泄露:一是在堆里創建了對象占用了內存,但是沒有顯示地釋放對象占用的內存;二是在類的構造函數中動態的分配了內存,但是在析構函數中沒有釋放內存或者沒有正確的釋放內存
2. 沒有正確地清除嵌套的對象指針
3. 在釋放對象數組時在delete中沒有使用方括號
方括號是告訴編譯器這個指針指向的是一個對象數組,同時也告訴編譯器正確的對象地址值病調用對象的析構函數,如果沒有方括號,那么這個指針就被默認為只指向一個對象,對象數組中的其他對象的析構函數就不會被調用,結果造成了內存泄露。如果在方括號中間放了一個比對象數組大小還大的數字,那么編譯器就會調用無效對象(內存溢出)的析構函數,會造成堆的奔潰。如果方括號中間的數字值比對象數組的大小小的話,編譯器就不能調用足夠多個析構函數,結果會造成內存泄露。
釋放單個對象、單個基本數據類型的變量或者是基本數據類型的數組不需要大小參數,釋放定義了析構函數的對象數組才需要大小參數。
4. 指向對象的指針數組不等同于對象數組
對象數組是指:數組中存放的是對象,只需要delete []p,即可調用對象數組中的每個對象的析構函數釋放空間
指向對象的指針數組是指:數組中存放的是指向對象的指針,不僅要釋放每個對象的空間,還要釋放每個指針的空間,delete []p只是釋放了每個指針,但是并沒有釋放對象的空間,正確的做法,是通過一個循環,將每個對象釋放了,然后再把指針釋放了
5. 缺少拷貝構造函數
兩次釋放相同的內存是一種錯誤的做法,同時可能會造成堆的奔潰。
按值傳遞會調用(拷貝)構造函數,引用傳遞不會調用。
在C++中,如果沒有定義拷貝構造函數,那么編譯器就會調用默認的拷貝構造函數,會逐個成員拷貝的方式來復制數據成員,如果是以逐個成員拷貝的方式來復制指針被定義為將一個變量的地址賦給另一個變量。這種隱式的指針復制結果就是兩個對象擁有指向同一個動態分配的內存空間的指針。當釋放第一個對象的時候,它的析構函數就會釋放與該對象有關的動態分配的內存空間。而釋放第二個對象的時候,它的析構函數會釋放相同的內存,這樣是錯誤的。
所以,如果一個類里面有指針成員變量,要么必須顯示的寫拷貝構造函數和重載賦值運算符,要么禁用拷貝構造函數和重載賦值運算符
6. 缺少重載賦值運算符
這種問題跟上述問題類似,也是逐個成員拷貝的方式復制對象,如果這個類的大小是可變的,那么結果就是造成內存泄露,如下圖:
7. 關于nonmodifying運算符重載的常見迷思
a. 返回棧上對象的引用或者指針(也即返回局部對象的引用或者指針)。導致最后返回的是一個空引用或者空指針,因此變成野指針
b. 返回內部靜態對象的引用。
c. 返回一個泄露內存的動態分配的對象。導致內存泄露,并且無法回收
解決這一類問題的辦法是重載運算符函數的返回值不是類型的引用,二應該是類型的返回值,即不是 int&而是int
8. 沒有將基類的析構函數定義為虛函數
當基類指針指向子類對象時,如果基類的析構函數不是virtual,那么子類的析構函數將不會被調用,子類的資源沒有正確是釋放,因此造成內存泄露
野指針:指向被釋放的或者訪問受限內存的指針。
造成野指針的原因:
指針變量沒有被初始化(如果值不定,可以初始化為NULL)
指針被free或者delete后,沒有置為NULL, free和delete只是把指針所指向的內存給釋放掉,并沒有把指針本身干掉,此時指針指向的是“垃圾”內存。釋放后的指針應該被置為NULL.
指針操作超越了變量的作用范圍,比如返回指向棧內存的指針就是野指針。
感謝各位的閱讀,以上就是“C++常見的內存泄漏有哪些”的內容了,經過本文的學習后,相信大家對C++常見的內存泄漏有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。