今天寫程序的時候碰到一個問題,在給一個指針拷貝內存的時候,總是出錯
memcpy(AudioSend_Stream, UdpPackageHead, 6);
後來發現是沒有開闢內存,好吧,比較低級的錯誤,然後開闢了一段內存空間
AudioSend_Stream = (unsigned char *)malloc(sizeof(UdpPackageHead));
之後發現沒問題了,後來又想起來,系統用malloc()/calloc()/realloc()等等時候,需要手動free,並且還需要置空。不然
會導致內存泄漏。之後我立馬把指針置空。但是接下來就出現了下面錯誤。
invalid address or address of corrupt block 0x6b91d928 passed to dlfree
很困惑,爲啥,說明是不能給一個損壞了的地址置空???
然後在代碼中找到了這句,
memcpy(AudioSend_Stream + 9, &talkdata, sizeof(talkdata));
這句代碼好像把指針的地址偏移了,然後我再釋放的時候,發現地址改變了,再次釋放會導致釋放了偏移了的地址。所以就報錯了。
解決這個的辦法也很簡單,在你偏移這個位置之前,定義一個相同的指針,然後賦給之前的指針。然後再用原來的指針偏移地址,最後釋放那個新定義的指針就好了。
unsigned char* AudioSend_Stream1 = NULL;
AudioSend_Stream1 = AudioSend_Stream;
memcpy(AudioSend_Stream + 9, &talkdata, sizeof(talkdata));
free(AudioSend_Stream1);
AudioSend_Stream1=NULL;
類似這樣,就可以防止釋放錯誤的地址。