前言
上一篇介绍了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);
}