2015-12-04 92 views
0

所以我創建了一個鏈表並打印出它的結果,但是當我嘗試釋放列表時它不起作用。釋放目標C中的鏈表?

這是我正在做它:

node = root; 
node = [node next]; 

while([node next] != nil) 
{ 
    ListNode *temp; 
    temp = [node next]; 
    free(node); 
    node = temp; 
} 

問題是,當我運行它,我只是得到一個錯誤,指出消息:Error in ./a.out: free(): invalid pointer: 0x0909720c

我不明白是什麼錯誤信息手段我不知道如何解決它。

這是接口:

@interface ListNode : NSObject 
{ 
@private 
    int value; 
    ListNode* next; 
} 

- (id) setValue: (int) value_value; 
- (int) value; 
- (id) setNext: (ListNode*) next_value; 
- (ListNode*) next; 

@end 
+1

沒有足夠的代碼來解決問題,但通常情況下,您不應該在Objective-C對象上調用'free'。 – zneak

+0

那麼如何刪除Objective C中的對象?如果您需要它,我可以向您展示更多代碼。 –

+1

您應該可以顯示您的'@interface'代碼,您如何創建'ListNode'對象,並告訴我們您的項目中是否啓用了自動引用計數(ARC)(如果您使用的是最近足夠的Xcode,則是默認)。 – zneak

回答

0

在Objective-C的每個對象具有「保留計數」,而當保留計數變爲零,則系統重新分配的對象。你永遠不要通過調用free來強制一個對象被釋放。你只是擺脫所有你對它的引用。您需要立即閱讀Cocoa Core Competencies: Object Ownership。這句話特別解決了你的問題:

當沒有剩餘的強對象引用時,該對象被取消分配。

+0

*保留計數變爲零時*是一個更準確的說法。保留數實際上爲零是很少見的。 – Avi