指標部分釋疑之二 記憶體的分配及記憶體錯誤型別(續)

2021-08-24 20:06:04 字數 3057 閱讀 2391

記憶體洩露故障(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肯定是錯誤的,所以找個機會總結一...