[C]安全釋放堆內存
1.在C語言的很多應用中常常需要使用malloc函數和free函數,為了防止內存泄漏和野指針的出現,需要在堆內存使用完畢後對指針指向的空間進行釋放並對指針進行置零
char*p = NULL;
p = (char*)malloc(10*sizeof(char));
.....
if(p!=NULL)
{
free(p);
p = NULL;
}
2.但當一次性需要malloc很多個不同類型的堆內存空間,需要檢查和釋放的時候,上面的代碼在釋放時得重復很多遍,代碼看起來很內啥,需要用宏或者函數來統一釋放,達到簡短、實用和美觀的效果。
3.宏的方法
#define SAFE_FREE(p) \
if(p!=NULL) \
{ \
free(p); \
p = NULL; \
}
需要釋放時,每次用宏替換即可。
3.函數通用方法
int safe_free(void** p)
{
if(*p!=NULL)
{
free(*p);
*p=NULL;
}
}
這個代碼在vs2015下,console exe工程中測試通過,但是這種void**兩級空指針的用法,默認了當前環境下所有類型指針長度是一樣的且各類二級指針引用方式一致,在嵌入式平臺中,這種做法的移植性未必好。(部分嵌入式平臺 指向code區、data區、xdata區的指針長度和訪問方式各有不同)
4.釋放單一數據類型的方法
int type_safe_free(type** p)
{
if(*p!=NULL)
{
free(*p);
*p=NULL;
}
}
缺點是每個類型都得寫一個,麻煩。
4.C++實現方法
對於3中提到的缺點,C++使用函數模板即可。
5.總結
還是用宏替換解決吧,雖然只是替換,但保證了代碼形式上的統一和美觀,且沒有移植性的障礙。
[C]安全釋放堆內存