Usb malloc导致堆损坏

Usb malloc导致堆损坏,usb,malloc,heap-memory,iokit,Usb,Malloc,Heap Memory,Iokit,我正在学习如何使用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) user

我正在学习如何使用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字节


有什么线索吗?

这两种说法应该是相反的:

dataBuffer = (char *)malloc(numBytes); 
numBytes = 64;

该死,你可能是对的(我会测试以确保)。这么晚了,我一定很困。。。我还是不敢相信我忽略了这点。@MattMcNabb是的,就是这样。把它写下来作为答案,这样我就可以标记为正确。