gpt4 book ai didi

objective-c++ - 使用 new[],其中大小是消息调用的结果会导致崩溃

转载 作者:行者123 更新时间:2023-12-04 02:52:50 24 4
gpt4 key购买 nike

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

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

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

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

工作正常。这是怎么回事?

最佳答案

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

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

ItemCell **rawCells = new ItemCell*;

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

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

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

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

关于objective-c++ - 使用 new[],其中大小是消息调用的结果会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17281461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com