2014-03-29 200 views
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个字节。

任何线索?

+0

妈的,你可能是正确的(我会测试,以确保)。这么晚了,我一定很昏昏沉沉......还是不敢相信我忽略了这一点。 – Guilherme

+0

@MattMcNabb是的,就是这样。把它写成答案,以便我可以标记为正确。 – Guilherme

回答

1

这两句话应该倒过来:

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