前言
上一篇介紹了C語言中 動態內存管理函數,本片講解的是 在我們使用動態內存管理時 常見的錯誤,一起來看看吧~
歡迎關注個人主頁:逸狼
創造不易,可以點點贊嗎~
如有錯誤,歡迎指出~
目錄
1.對NULL指針的解引?操作
錯誤代碼展示
修改
2.對動態開辟空間的越界訪問
錯誤代碼展示
修改
3 .對?動態開辟內存使?free釋放
錯誤代碼展示
4 .使?free釋放?塊動態開辟內存的?部分
錯誤代碼展示
5. 對同?塊動態內存多次釋放
錯誤代碼展示
修改
6.動態開辟內存忘記釋放(內存泄漏)
錯誤代碼展示
修改?編輯
1.對NULL指針的解引?操作
錯誤代碼展示
int main()
{int* p = (int*)malloc(100);*p = 20;//p有可能是NULL指針 //釋放free(p);p = NULL;return 0;
}
修改
2.對動態開辟空間的越界訪問
錯誤代碼展示
int main()
{int *p=(int*)malloc(40);if (p == NULL){return 1;}//使用for (int i = 0; i <= 10; i++){*(p + i) = i;//當訪問第11個元素時,就越界訪問了}free(p);p = NULL;return 0;
}
修改
3 .對?動態開辟內存使?free釋放
錯誤代碼展示
int main()
{int a = 10;//?動態開辟內存int* p = (int*)malloc(40);if (p == NULL){return 1;}//使用//……p = &a;//p指向的空間不再是堆區上空間了free(p);p = NULL;return 0;
}
4 .使?free釋放?塊動態開辟內存的?部分
錯誤代碼展示
void test()
{int *p = (int *)malloc(100);if (p == NULL)return 1;//使用p++;//釋放free(p);//p不再指向動態內存的起始位置
}
5. 對同?塊動態內存多次釋放
錯誤代碼展示
void test()
{int* p = (int*)malloc(100);if (p == NULL){return 1;}free(p);free(p);//重復釋放
}
修改
6.動態開辟內存忘記釋放(內存泄漏)
malloc、calloc、realloc申請的空間如果不主動釋放,出了作用域不會銷毀
釋放的方式
- free主動釋放
- 直到程序結束,由操作系統回收
malloc函數出了test函數申請的空間不會銷毀,造成內存泄漏
錯誤代碼展示
void test()
{int* p = (int*)malloc(100);if (NULL != p){*p = 20;}
}int main()
{test();while (1);
}