启用ARC时隐藏内存错误

时间:2012-09-10 17:00:18

标签: objective-c memory-leaks

我正在创建一个Objective-C库,通过USB与一些外部设备通信。 当调用某个方法时,它会在方法内部的某个随机位置或某些C系统函数(与malloc或pthread相关)中崩溃,并出现以下错误之一“释放对象的无效校验和”,“autorelease pool page 0x1102032 corrupted”,甚至是未知的选择器错误(而选择器确实存在)。

使用Guard Malloc功能,它会在此行停止并出现EXEC_BAD_ACCESS错误:

- (void)theMethod {

// some code

NSMutableData *payloads_pool = [NSMutableData dataWithLength:0x800];
NSUInteger payloads_pool_length = [payloads_pool length];

void *buffer = [payloads_pool mutableBytes];

memset(buffer, 0xCC, payloads_pool_length);

for (i = 0; i < 0x800; i += 0x40) {

    unsigned int *buf = [payloads_pool mutableBytes];

    (buf+i)[0] = 0x405;      <==== STOP ON THIS LINE
    (buf+i)[1] = 0x101;
    (buf+i)[2] = 0x8402B001;
    (buf+i)[3] = 0x8402EB01;
}

// some code
}

2 个答案:

答案 0 :(得分:3)

由于bufunsigned int*+中的指针buf+i不是添加无符号整数而不是字节,因此在内存中寻找太远了吗?

答案 1 :(得分:2)

然后我猜测payloads_pool的字节数少于0x800

崩溃时i的价值是多少?

为什么你的for循环从0变为payloads_pool.length