Objective c 启用ARC时隐藏内存错误

Objective c 启用ARC时隐藏内存错误,objective-c,memory-leaks,Objective C,Memory Leaks,我正在创建一个Objective-C库,通过USB与一些外部设备进行通信。 调用某个方法时,它会在该方法或某些C系统函数(与malloc或pthread相关)内的任意位置崩溃,并出现以下错误之一“释放对象的校验和无效”、“自动释放池页面0x1102032已损坏”,甚至出现未知选择器错误(而选择器确实存在) 使用Guard Malloc功能,它在此行停止,并出现EXEC\u BAD\u访问错误: - (void)theMethod { // some code NSMutableData *p

我正在创建一个Objective-C库,通过USB与一些外部设备进行通信。 调用某个方法时,它会在该方法或某些C系统函数(与malloc或pthread相关)内的任意位置崩溃,并出现以下错误之一“释放对象的校验和无效”、“自动释放池页面0x1102032已损坏”,甚至出现未知选择器错误(而选择器确实存在)

使用Guard Malloc功能,它在此行停止,并出现EXEC\u BAD\u访问错误:

- (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
}
—(无效)方法{
//一些代码
NSMutableData*有效负载_池=[NSMutableData数据长度:0x800];
NSU整数有效负载_池长度=[有效负载_池长度];
void*buffer=[payloads\u pool mutableBytes];
memset(缓冲区,0xCC,有效负载\u池\u长度);
对于(i=0;i<0x800;i+=0x40){
unsigned int*buf=[payloads_pool mutableBytes];

(buf+i)[0]=0x405;那么我猜
payloads\u pool
中的字节数少于
0x800

当它崩溃时,
i
的值是多少


为什么你的for循环没有从0到
有效负载池。长度

既然
buf
unsigned int*
,那么
buf+i
中的指针
+
不是在添加无符号整数而不是字节,从而在内存中搜索得太远吗?

i
的值不是0x280(640)现在它从0循环到
payloads\u pool\u length
,但它不会改变任何东西。同时在调试器中检查局部变量,它显示
payloads\u pool
在长度上是
0x800
,然后你应该考虑@zoul的答案-你循环到字节数,但将它们视为
int
s-你需要d循环到
length/sizeof(int)
值640似乎证实了我的答案,因为如果目标的
unsigned int
的大小为4字节,640*4超过2048(0x800),而上一次迭代((640-64)*4)很好。感谢这些解释!我希望可以,但我没有足够的声誉:(