2012年1月9日 星期一

寫C時容易犯的一些錯誤 - about memory usage

1. Memory leak

在寫一支程式時, 我們經常會宣告一段記憶體空間作為使用. 但使用完之後如果忘了將記憶體歸還給系統, 那麼整個系統的記憶體資源將會在這支AP的執行期間漸漸被吃掉, 直到記憶體全被吃光, 造成整個系統當機. 在寫embedded system的AP時特別需要注意, 很多bug都是因為忘了free memory 導致可憐的小RD在座位上爆肝一週甚至一個月以上...XD

函式回傳以malloc宣告的memory address

網路上常舉的例子是strdup(), strdup()回傳的address是以malloc宣告出來的, 當不使用後一定要將該address free掉. 自己實作函式的時候, 如果回傳的是一個必須free的pointer, 盡量在註解中告知使用者.

記得free的時機和先後順序
     
舉個簡單例子,
char *a= malloc(sizeof(char) * 10);
char *b= malloc(sizeof(char) * 10);
a=b;

a和b兩個指標皆指到各別宣告的記憶體空間, 但執行a=b後, a原本宣告的記憶體空間變成沒人可以指定到的空間, a所宣告的記憶體會變成沒人要的孤兒, 最後結果就是造成10bytes memory leak.

在structure變數的宣告及使用也是類似的概念, 當一個structure內的指標指向一段malloc出來的記憶體時, 在free structure前必須先確定原先指向的指標, 它是否會在其它地方被安全free掉.

Thread設定(pthread)

請記得在呼叫thread後將thread設定為detach, 或是使用pthread_join(). 設定detach的意思是讓該thread執行結束時自動釋放資源. 如果沒給thread detach屬性, 或是使用pthread_cancel() or pthread_exit()而沒去pthread_join()的話, 鐵定又要罰坐在位子上debug好一陣子.