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

2021-05-08 05:20:43 字數 3236 閱讀 4345

記憶體洩露故障

(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肯定是錯誤的,所以找個機會總結一...