1
我正在学习如何与由于IOKit USB设备进行通信,而我写这段代码:的malloc导致堆损坏
// 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
(定时器将重复触发)。
在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个字节。
任何线索?
妈的,你可能是正确的(我会测试,以确保)。这么晚了,我一定很昏昏沉沉......还是不敢相信我忽略了这一点。 – Guilherme
@MattMcNabb是的,就是这样。把它写成答案,以便我可以标记为正确。 – Guilherme