【C语言】常见的动态内存管理错误

前言

上一篇介绍了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申请的空间如果不主动释放,出了作用域不会销毁
释放的方式

  1. free主动释放
  2. 直到程序结束,由操作系统回收

malloc函数出了test函数申请的空间不会销毁,造成内存泄漏

错误代码展示


void test()
{
	int* p = (int*)malloc(100);
	if (NULL != p)
	{
		*p = 20;
	}
}

int main()
{
	test();
	while (1);
}

修改

  • 42
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值