2011-04-20 48 views
2

難道我說得相當於:C++相當於在Objective-C [頁頭[INIT]

NSMutableArray *foo; 
foo = [[NSMutableArray alloc] init]; 
[foo release]; 

是C++:

NSMutableArray *foo = new NSMutableArray(); 
delete foo; 

即。 Obj-C的第二行執行動態內存分配,而第一行只是做一個指針?在這種情況下,[init] VS的功能是什麼。 [頁頭]?

感謝球員 - 我幾乎找到了一點C++幾乎是學習Obj-C的障礙!

+1

我不認爲_ANY_語言與[xxx [alloc [init]]等東西相當,包括ObjC – JustSid 2011-04-20 16:30:21

+0

你在技術上是正確的,最好的一種正確! – EightyEight 2011-04-20 16:34:32

+0

感謝您的有用評論JustSid(固定錯字) – Pete 2011-04-20 16:34:40

回答

2

內部C++可以做一些非常類似於alloc + init的事情。在這種情況下,alloc會執行實際的內存分配(new),並且init會或多或少地作爲構造函數。

2

alloc相當於new()init相當於C++對象的構造函數。

0

除了已經顯示的代碼的基本語義之外,您必須考慮內存由給定編程語言處理的方式。在Objective-C中,每個對象都有一個保留計數,它在調用釋放時使用(並且對象在刪除之前需要保留計數爲0)。在C++中不存在這樣的機制,並且在使用新的和刪除(可能存在內存泄漏)時,你必須全部處理內存。

如果你想要內存管理ala Objective-C,你應該檢出包含shared_ptr對象(其行爲更像Objective-C)的C++ 0x的頭部。

+0

謝謝yag我忘了你也得到了分配的對象數量。 – Pete 2011-04-20 16:41:29

+0

shared_ptr已經可以從Boost獲得一段時間了,我發現它非常有用。 – 2011-04-20 21:16:27

1

我覺得最近的C++等同於Objective-C的兩級分配/初始化將調用malloc分配一個緩衝區,然後用安置新來調用構造函數以前分配的內存塊:

void *buffer = malloc(sizeof(NSMutableCPPArray)); 
NSMutableCPPArray *foo = new(buffer) NSMutableCPPArray(); 

在本例中,第一行對應於alloc,動態分配一個新的內存塊供對象使用。第二行類似於init,調用構造函數初始化該內存塊。

當然,一個關鍵的區別是Objective-C的alloc/init對是標準基礎庫的一個基礎和廣泛使用的部分。相比之下,新的放置是C++的奇怪且很少使用的角落,加載了caveats and warnings in the online C++ FAQ