2014-03-29 380 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;