記憶體洩露故障(memory leak faults
,mlf
)是指在程式的某處申請了大小為x
位元組的空間,方式程式結束時這x
位元組的空間全部或部分沒有釋放、多次釋放都屬於記憶體洩露故障。
mlf有三種形式:
(1)遺漏故障:申請的記憶體沒有釋放;
(2)不匹配故障:申請函式和釋放函式不匹配;
(3)不相等的釋放:釋放的空間和申請的空間大小不一樣。
在c++
中,mlf
有以下表現形式: þ
第一類mlf
:在程式中申請了記憶體,但沒有去釋放
void main()
在程式中為p
申請了記憶體空間,但是使用完成後沒有去釋放,即第一類mlf。
þ第二類mlf
:p
是用malloc
分配的變數,若存在且只有乙個free(p)
,那麼p
的使用是正確的。反之,如果存在兩個或兩個以上free(p)
,或者無free(p)
,或者存在乙個或乙個以上的delete p
,則稱為第二類mlf
。
int *p = (int *)malloc(10*sizeof(int));
......
delete p;
þ第三類mlf
:p
是用new
分配的變數,若存在且只有乙個delete p;
,那麼p
的使用是正確的。反之,如果存在兩個或兩個以上delete p
,或者無delete p
,或者存在乙個或乙個以上的free(p)
,則稱為第三類mlf
。
int *p = new int[10];
......
free(p);
þ第四類mlf
:p
是用new
分配的變數,若存在且只有乙個delete
,則p
的使用是正確的。反之,如果用delete
或free
釋放,則是第四類mlf
class a; p = new a[10];
......
delete p;
þ第五類mlf
:多餘的delete
和free
是第五類mlf
char *p = 「abc」;
......
free(p);
þ第六類mlf
:當申請記憶體的p
發生變化後,用delete
和free
釋放變化後的p
是第六類mlf
。
char *p = new char[10];
......
++p;
......
delete p;
þ第七類mlf
;如果在建構函式中有申請記憶體的操作,且在其他函式中出現物件的拷貝,如果無拷貝(複製)建構函式,則會產生析構函式對記憶體重複釋放的錯誤。該類錯誤為第七類mlf
。
#include
#include
class stu
void show() //
輸出函式
~stu( ) //
析構函式
private:
char *name; //
學生姓名
int age; //
學生年齡 };
void main( )
上述程式在執行的時候會輸出:
the studnet's name is:john
the student's age is:20
the studnet's name is:john
the student's age is:20
然後會彈出:「debug assertion failed!
」的錯誤對話方塊,原因就在於用物件s1
初始化s2
的時候系統呼叫了系統提供的預設拷貝建構函式,只是將s1
的指標變數name
的內容(即位址)傳送給了s2
的指標變數name
,那麼s1
和s2的name
指向的是同乙個空間,在主函式執行結束後,系統先析構s2
,這是就將s2
的指標變數name
指向的空間釋放了,然後系統析構s1
的時候就會出現重複釋放同一空間的情況,這就是第七種mlf。
對於上述問題,解決方法就是定義使用者給出的拷貝建構函式:
stu(const stu &p)
指標部分釋疑之二 記憶體的分配及記憶體錯誤型別(續)
記憶體洩露故障 memory leak faults mlf 是指在程式的某處申請了大小為 x位元組的空間 方式程式結束時這 x位元組的空間全部或部分沒有釋放 多次釋放都屬於記憶體洩露故障。mlf有三種形式 1 遺漏故障 申請的記憶體沒有釋放 2 不匹配故障 申請函式和釋放函式不匹配 3 不相等的釋...
c 指標(二) 定義變數時的記憶體分配
為什麼要講記憶體分配呢,因為要理解指標的實質,就必須得從理解記憶體開始 1 計算機中記憶體編址 記憶體是乙個存放資料的空間,進行編址之後可以對資料空間進行合理的利用和管理。記憶體編址的基本單位是位元組。2 變數的定義,背後的記憶體分配 int a 當我們定義乙個int型別的變數 a 時,系統就開始準...
指標陣列 陣列指標的分配記憶體及函式引數 C語言版
最近寫 總是被基礎知識卡住,十分耽誤時間,今天又卡住了。所以下定決心一定要弄清楚這個問題,然後不好的是網上的資料總是解決的並不清楚,總是在糾結什麼是指標陣列什麼是陣列指標,看了 c缺陷和陷阱 也沒有我想要的東西。要麼就是c和c 混為一談,new int 5 這種語法c肯定是錯誤的,所以找個機會總結一...