ARC & Malloc: EXEC_BAD_ACCESS



我已经在一个项目上工作了一段时间,我决定跳到ARC。我遇到了一些每次都会爆炸的代码,我想知道为什么。我已经设法将其简化为以下片段:

typedef __strong id MYID;
int main(int argc, char *argv[])
{ 
    MYID *arr = (MYID *) malloc(sizeof(MYID) * 4);
    arr[0] = @"A";     // always get an EXEC_BAD ACCESS HERE
    arr[1] = @"Test";
    arr[2] = @"Array";
    arr[3] = @"For";
    // uh oh, we need more memory
    MYID *tmpArray = (MYID *) realloc(arr, sizeof(MYID) * 8);
    assert(tmpArray != NULL);
    arr = tmpArray;
    arr[4] = @"StackOverflow";  // in my actual project, the EXEC_BAD_ACCESS occurs here
    arr[5] = @"Is";
    arr[6] = @"This";
    arr[7] = @"Working?";
    for (int i = 0; i < 8; i++) {
        NSLog(@"%@", arr[i]);
    }
    return 0;
}

我不太确定这里发生了什么,在4个不同的项目中厌倦了这一点,他们都失败了。我的malloc呼叫有问题吗?有时它返回null,有时它返回一个我无法访问的指针。

崩溃是因为您将malloc'd内存转换为对象的C数组。当您尝试分配给其中一个插槽时,ARC将释放上一个值,该值将是垃圾内存。尝试使用calloc()而不是malloc()来获得零内存,它应该可以工作。

请注意,您的realloc()调用也不会对任何已分配的新内存进行零填充,因此,如果您需要realloc(),则可能需要使用临时void*指针,然后在将其分配给对象数组之前手动对其进行零填充。

malloc函数不会将其分配的内存归零。内存可以包含随机垃圾。

来自Clang自动参考计数指南,第4.2节:

对于__strong对象,首先保留新的指针对象;其次,左值加载了原始语义;第三,将新的指针对象存储到具有原语语义的左值中;最后,旧指针对象被释放

所以这里可能发生的是malloc正在返回包含随机非零值的内存。ARC试图使用该随机值作为指向对象的指针并释放它,但它不是有效的对象指针。崩溃

相关内容

  • 没有找到相关文章