Objective C 空指標和野指標

2022-06-12 12:48:07 字數 1835 閱讀 3906

一、什麼是空指標和野指標

1.空指標

1> 沒有儲存任何記憶體位址的指標就稱為空指標(null指標)

2> 空指標就是被賦值為0的指標,在沒有被具體初始化之前,其值為0。

下面兩個都是空指標:

1 student *s1 = null;

2 3 student *s2 = nil; 

複製**

2.野指標

"野指標"不是null指標,是指向"垃圾"記憶體(不可用記憶體)的指標。野指標是非常危險的。

二、野指標和空指標例子

接下來用乙個簡單的例子對比一下野指標和空指標的區別

1.首先,開啟xcode的記憶體管理除錯開關,它能幫助檢測垃圾記憶體

2.自定義student類,在main函式中新增下列**

1 student *stu = [[student alloc] init];

2 3 [stu setage:10];

4 5 [stu release];

6 7 [stu setage:10];

複製**

執行程式,你會發現第7行報錯了,是個野指標錯誤!

3.接下來分析一下報錯原因

1> 執行完第1行**後,記憶體中有個指標變數stu,指向了student物件

student *stu = [[student alloc] init];

假設student物件的位址為0xff43,指標變數stu的位址為0xee45,stu中儲存的是student物件的位址0xff43。即指標變數stu指向了這個student物件。

2> 接下來是第3行**

[stu setage:10];

這行**的意思是:給stu所指向的student物件傳送一條setage:訊息,即呼叫這個student物件的setage:方法。目前來說,這個student物件仍存在於記憶體中,所以這句**沒有任何問題。

3> 接下來是第5行**

[stu release];

這行**的意思是:給stu指向的student物件傳送一條release訊息。在這裡,student物件接收到release訊息後,會馬上被銷毀,所占用的記憶體會被**。

(release的具體用法會放到oc記憶體管理中詳細討論)

student物件被銷毀了,位址為0xff43的記憶體就變成了"垃圾記憶體",然而,指標變數stu仍然指向這一塊記憶體,這時候,stu就稱為了野指標!

4> 最後執行了第7行**

[stu setage:10];

這句**的意思仍然是: 給stu所指向的student物件傳送一條setage:訊息。但是在執行完第5行**後,student物件已經被銷毀了,它所占用的記憶體已經是垃圾記憶體,如果你還去訪問這一塊記憶體,那就會報野指標錯誤。這塊記憶體已經不可用了,也不屬於你了,你還去訪問它,肯定是不合法的。所以,這行**報錯了!

4.如果改動一下**,就不會報錯

1 student *stu = [[student alloc] init];

2 3 [stu setage:10];

4 5 [stu release];

6 7 stu = nil;

8 9 [stu setage:10];

複製**

注意第7行**,stu變成了空指標,stu就不再指向任何記憶體了

因為stu是個空指標,沒有指向任何物件,因此第9行的setage:訊息是發不出去的,不會造成任何影響。當然,肯定也不會報錯。

5.總結

1> 利用野指標發訊息是很危險的,會報錯。也就是說,如果乙個物件已經被**了,就不要再去操作它,不要再嘗試給它發訊息

。2> 利用空指標發訊息是沒有任何問題的,也就是說下面的**是沒有錯誤的:

[nil setage:10];

空指標和野指標

關於多次free 出現的野指標的原因 指標變數和指標變數所指的記憶體空間變數是兩個不同的概念 free 最主要釋放的指標變數所指的記憶體空間,因為記憶體資源是有限的,很寶貴,需要 利用 但是指標變數本身的值還是之前的指向,未重置成null 所以再次釋放的時候,指向了未知的記憶體區域,產生野指標 避免...

野指標和空指標

1.是取位址符號,是公升維度的,取其右邊變數的位址,如 d取變數d的位址。是取值符號 間接訪問 是降維度的,表示右邊指標變數所指向的變數,如 p表示指標變數p所指向的變數 2.float p d 則 p是變數d,而 p是變數p 即變數d 的位址p,p等價於p.3.在定義指標型別一定要和變數的型別對應...

c 空指標和野指標

野指標不同於空指標,空指標是指乙個指標的值為null,而野指標的值並不為null,野指標會指向一段實際的記憶體,只是它指向 我們並不知情,或者是它所指向的記憶體空間已經被釋放,所以在實際使用的過程中,我們並不能通過指標判空去識別乙個指標是否為野指標。野指標可能指向乙個可用的,但是正在被使用的空間,如...