我正在学习如何使用IOKit与USB设备进行通信,我写了这段代码:
// Global variable
char *dataBuffer;
- (void)startPolling {
if (!shouldPoll) { // Prevent polling twice
shouldPoll = YES;
timer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(poll) userInfo:nil repeats:NO];
[self performSelectorInBackground:@selector(poll) withObject:nil];
}
}
- (void)poll {
dataBuffer = (char *)malloc(numBytes);
numBytes = 64;
returnCode = (*usbInterface)->ReadPipe(usbInterface, 2, dataBuffer, &numBytes);
// Handle received data in dataBuffer
free(dataBuffer);
[timer fire];
}
它的工作方式如下:代码的另一部分工作正常,查找设备,打开它,然后打开正确的界面。之后,当用户按下按钮时,它将调用startPolling
,这将设置一个每0.5秒触发方法poll
的计时器(sorta,计时器将重复再次触发)。
在poll
方法中,程序将读取USB管道并在dataBuffer
上存储数据。起初,我认为我可以分配一次内存并在每次迭代时重用指针,但由于我不熟悉的原因,第二次ReadPipe
调用将失败。总是
在绝望的行为中,我提出了这个(可怕的?)想法:在每次迭代时分配并释放缓冲存储器。令我惊讶的是它确实有效,我能够成功读取设备。
问题是程序不时会因错误而崩溃:
malloc: *** error for object 0x610000005890: Heap corruption detected, free list canary is damaged
*** set a breakpoint in malloc_error_break to debug
我真的不知道这意味着什么,更不用说如何解决它了。我将缓冲区大小设置为64,以确保读取的任何数据都适合内存。实际数据长度为18个字节。
任何线索?
答案 0 :(得分:1)
这两个陈述应该相反:
dataBuffer = (char *)malloc(numBytes);
numBytes = 64;