C語言內存分配管理常見bug

標準C庫提供了4個內存管理函數:malloc、calloc、realloc和free。

bug1

調用free釋放p指向的內存塊之後,p就是一個懸掛指針——指向邏輯上不存在的內存的指針。如果引用這個懸掛指針,會導致不可預見的錯誤。

ElemType* p = (ElemType*)malloc(sizeof(ElemType) * NUM);
...
free(p);// p = NULL;
...
*p = "...";

bug2

釋放空閒內存,破壞內存管理函數所用的數據結構。

ElemType* p = (ElemType*)malloc(sizeof(ElemType) * NUM);
...
free(p);
...
free(p);

bug3

釋放並非malloc、calloc或realloc分配的內存。

ElemType buf[20], *p;
if(n >= sizeof(buf){
    p = (ElemType*)malloc(sizeof(ElemType) * NUM);
}else{
    p = buf;
}
...
free(p);

bug4

1、沒有考慮內存分配不成功的情況。如果分配失敗應返回NULL;
2、使用後沒有釋放內存,多次調用會導致內存泄漏;

void itoa(int n, char *buf, int size){
    char *p = malloc(43);

    sprintf(p, "%d", n);
    if(strlen(p) >= size-1){//如果數字個數大於size-1時,用*填充。
        while(--size > 0){
            *buf++ = '*';
        }
        *buf = '\0';
    }else{
        strcpy(buf, p);
    }
}

初學者更容易犯下面的錯誤。itoa試圖返回buf的內容,但itoa返回後,buf已經被清空了。

char *itoa(int n){
    char buf[43];

    sprintf(buf, "%d", n);
    return buf;
}

Wu_Being博客聲明:本人博客歡迎轉載,請標明博客原文和原鏈接!謝謝!
《C語言內存分配管理常見bug》: http://blog.csdn.net/u014134180/article/details/78335307

Wu_Being 吳兵博客接受贊助費二維碼

如果你看完這篇博文,覺得對你有幫助,並且願意付贊助費,那麼我會更有動力寫下去。

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