2013-06-24 21 views
3

我有一些Objective-C++代碼爲Objective-C對象指針數組動態分配空間。通過Objective-C消息調用計算大小:使用新的[],其中大小是消息調用的結果導致崩潰

ItemCell **rawCells = new ItemCell*[[self cellCount]]; 

此代碼最終導致段錯誤。相似的代碼

ItemCell **rawCells = (ItemCell**)std::malloc([self cellCount] * (sizeof *rawCells)); 

工作得很好。這裏發生了什麼?

+0

由於問題已回答,因此應該關閉。 – Ali

+0

@albatross用你的答案創建了一個答案。 +1 – Yakk

+0

感謝您的幫助:) – antron

回答

4

從海報的答案複製(他缺乏因果報應來回答自己,所以他把它的問題),並標記爲社區維基(因爲複製/粘貼不應該賺我的業力):

問題是[[self cellCount]]被視爲C++11 attribute並被忽略,因爲編譯器不能識別它。結果是線路有效地變爲

ItemCell **rawCells = new ItemCell*; 

它沒有分配足夠的存儲空間。我在gdb中證實了這一點--的參數是8,單個指針的大小。

解決這個最簡潔的方法是插入一對額外的括號來阻止編譯器識別[[]]作爲屬性語法:

ItemCell **rawCells = new ItemCell*[([self cellCount])]; 

您還可以將[self cellCount]結果存儲在本地變量並參考new[]調用中的那個。

+0

另外,請注意,在這種情況下,您可以使用點語法'self.cellCount',產生'new ItemCell * [self.cellCount]',它也可以很好地解析。但這對於更復雜的方法調用不起作用。 – antron

相關問題