malloc之後free導致出錯的問題

今天寫程序的時候碰到一個問題,在給一個指針拷貝內存的時候,總是出錯

 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;

類似這樣,就可以防止釋放錯誤的地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章