ARC&Malloc:EXEC_BAD_ACCESS

Ric*_*III 5 c malloc objective-c realloc automatic-ref-counting

我一直在做一个项目已经有一段时间了,我决定跳到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;
}
Run Code Online (Sandbox Code Playgroud)

我不太确定这里发生了什么,在4个不同的项目中厌倦了这些,而且都失败了.我的malloc电话有问题吗?有时它返回null,有时它返回一个我无法访问的指针.

Lil*_*ard 13

崩溃是因为您将malloc内存转换为C对象数组.当您尝试分配给其中一个插槽时,ARC将释放先前的值,这将是垃圾内存.尝试使用calloc()而不是malloc()获取归零内存,它应该工作.

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

  • 宕.微妙.在这个例子中,你真的必须知道很多关于retain/release/C才能使用ARC. (3认同)

rob*_*off 8

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

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

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

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