常見動態記憶體錯誤
編譯器不能自動發現動態記憶體錯誤,動態記憶體錯誤通常只能在程式執行時才能**捉到,而且錯誤原因不容易查詢,錯誤本身也不容易捕捉,改錯難度較大。
1.動態記憶體分配失敗卻繼續操作
記憶體不足等有可能導致動態記憶體分配失敗,所以使用new請求分配動態記憶體後一定要檢查返回位址是否為null。
如用if(p==null) 或 if(p!=null)進行檢查,未檢查前不要操作動態記憶體空間。
2.動態記憶體空間未初始化就進行讀操作
c++標準並未規定動態記憶體空間的預設值,程式無法預知該預設值的具體指。因此,未經初始化的動態記憶體空間可能持有乙個不確定的值。
所以申請分配動態記憶體空間的同時,要初始化該動態記憶體空間,盡量不要使用系統預設值。
3.動態記憶體空間越界使用
指標的功能雖然很強,但它容易指向錯誤的地方。當指標指向不正確的資料型別時,指標操作就會出錯。
尤其是當指標指向乙個陣列時,很容易越界,造成錯誤。
4.記憶體洩漏
記憶體洩漏是一種比較嚴重的動態記憶體錯誤。程式長時間執行最終可能導致記憶體耗盡,執行速度變慢甚至系統奔潰。
例如:new與delete使用不配對,就可能導致new的空間未被delete。
使用new運算子申請分配的記憶體空間使用完後,一定要記得使用delete釋放,且new形式要與delete對應。
5.繼續使用已經釋放了的動態記憶體空間
執行delete後,相應的指標變數的值未被改變,它依然指向原來的動態記憶體空間,只是原來動態記憶體空間的內容已經毫無意義了。
所以在執行delete之後,通常要將指標變數的值置成null,以免對記憶體空間進行誤操作或者無效操作。
下面具體講講記憶體洩漏:
記憶體洩漏
指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。
記憶體洩漏並非指內存在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。
下面舉幾個例子:
1.下面a先是申請了乙個int型的動態記憶體空間,初始化值為12,後面a又申請了乙個int型空間,初始化值為34,
則第一次儲存12的空間就不會被釋放,並且儲存12的空間沒有被釋放,也不能被使用了,造成了記憶體洩漏。
[cpp]view plain
copy
print?
#include
using
namespace std;
int main()
#includeusing namespace std;
int main()
void f(void)
最好的做法就是:
[cpp]view plain
copy
print?
void f(void)
void f(void)
3.出現以下問題呢?
[cpp]view plain
copy
print?
//f返回乙個指標,指向乙個動態分配的物件
int *f(t arg)
//f返回乙個指標,指向乙個動態分配的物件
int *f(t arg)
返回指向動態記憶體的指標的函式給其呼叫者增加了乙個額外的負擔---
呼叫者必須記得釋放記憶體。
4.delete只提供了有限的保護
看下面的例子:
執行delete後,相應的指標變數的值未被改變,它依然指向原來的動態記憶體空間,只是原來動態記憶體空間的內容已經毫無意義了。
所以在執行delete之後,通常要將指標變數的值置成null,以免對記憶體空間進行誤操作或者無效操作。
但是,[cpp]view plain
copy
print?
int *p=new
int (42);
auto q=p;
delete p;
p=null;
int *p=new int (42);
auto q=p;
delete p;
p=null;
p和q指向相同的動態分配的物件,我們delete此記憶體,然後將p置為null,指出它不再指向任何物件。但是,重置p對q沒有任何作用,在我們釋放p所指向的(同時也是q所指向的)記憶體時,q也變得無效了。在實際系統中,查詢指向相同記憶體的所有指標是異常困難的。
常見動態記憶體錯誤
一 對null指標的解引用操作 void test 二 對動態開闢空間的越界訪問 void test2 for i 0 i 10 i free p 三 對非動態記憶體使用free釋放 void test3 四 使用free釋放一塊動態開闢記憶體的一部分 void test4 五 對一塊動態記憶體多次...
動態記憶體洩漏
動態記憶體洩露分析 2 xcode自帶的工具 instrument中的leaks allocations工具可以幫助我們進行記憶體洩露的排查,但它們存在不足。在 arc 時代更常見的記憶體洩露是迴圈引用導致的 abandoned memory,leaks 工具查不出這類記憶體洩露,應用有限 inst...
常見的動態記憶體錯誤
來自 c 和指標.p223 在使用動態記憶體分配的程式中,常常會出現許多錯誤。這些錯誤包括對null指標進行解除引用操作 對分配的記憶體進行操作時越過邊界 釋放並非動態分配的記憶體 試圖釋放一塊動態分配的記憶體的一部分以及一塊動態記憶體被釋放之後還繼續使用它。以下是一些需要注意的事項 1 在請求動態...