【问题标题】:Occasional EXC_BAD_ACCESS when assigning value in C id __strong * array在 C id __strong * 数组中赋值时偶尔出现 EXC_BAD_ACCESS
【发布时间】:2012-12-05 17:02:06
【问题描述】:

id __strong * 数组中分配值时,EXC_BAD_ACCESS 崩溃

这是代码

    id __strong *entries;
    entries = (id __strong *)malloc(sizeof(id) * 20);

    for (NSUInteger j = 0; j < 20; j++)
    {

        entries[j] = @{@"key1" : @"value1",  // Crash
                       @"key2" : @"value2",
                       @"key3" : @"value3"]};
    }

    //...

    free(entries);

值是什么并不重要。即使这样:

    entries[j] = [NSNumber numberWithInt:1];

崩溃。

它不会每次都崩溃,但会在几次尝试后发生。在索引 0 处分配值时会发生崩溃,因此它不会在 for 循环的中途发生,并且切断 for 循环并不能解决崩溃问题。

启用NSZombies 停止会出现崩溃,但没有输出抱怨任何僵尸。使用 Zombies Instrument 时也会发生同样的情况 - 没有崩溃,没有僵尸输出。启用 Guard Malloc 似乎也可以阻止崩溃。

__strong 更改为__autoreleasing 似乎也可以阻止崩溃,但这真的可以解决问题吗?如果是,为什么?

有什么想法吗?

【问题讨论】:

    标签: objective-c malloc automatic-ref-counting exc-bad-access


    【解决方案1】:

    我不是 100% 确定,但你不应该使用 calloc 吗?

        entries = (id __strong *)calloc(sizeof(id), 20);
    

    也许这就是问题所在,因为它不是零初始化的。在释放之前,您需要将变量清零。

    【讨论】:

    • (+1) 是的,这正是问题所在(我正要给出相同的答案)。使用 ARC,编译器生成代码以释放先前分配的值,然后再将新值分配给 entries[j]。如果 entries[j] 未初始化,则会崩溃。
    • 好的,谢谢。将malloc 更改为calloc 解决了这个问题。只是为了兴趣,你知道为什么它没有每次都崩溃吗?
    • 也许分配的内存恰好是“新鲜的”,因此包含 0,其他时候,它没有。
    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 2011-01-08
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多