3

我有一些Objective-C++ 代码,它为Objective-C 对象指针数组动态分配空间。大小由 Objective-C 消息调用计算:

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

此代码最终会导致段错误。类似的代码

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

工作得很好。这里发生了什么?

4

1 回答 1

4

从海报的答案中复制(他缺乏回答自己的业力,所以他把它放在问题中),并标记为社区维基(因为复制/粘贴不应该为我赢得业力):

问题是它[[self cellCount]]被视为C++11 属性并被忽略,因为编译器无法识别它。结果是这条线有效地变成了

ItemCell **rawCells = new ItemCell*;

它没有分配足够的存储空间。我在 gdb 中确认了这一点 - 的参数new是 8,即单个指针的大小。

解决这个问题的最简洁的方法是插入一对额外的括号,以防止编译器将其识别[[]]属性语法:

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

您还可以将结果存储[self cellCount]在局部变量中并在new[]调用中引用它。

于 2013-06-24T18:49:28.677 回答