malloc导致堆损坏

时间:2014-03-29 05:10:15

标签: 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) 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个字节。

任何线索?

1 个答案:

答案 0 :(得分:1)

这两个陈述应该相反:

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