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