【C语言详解】这些常见的动态内存错误,你都知道吗?

文章列举了动态内存管理中六个常见的错误,包括对NULL指针的解引用、越界访问、对非动态内存使用free、释放内存一部分、多次释放同一内存和忘记释放。解决方案包括进行NULL检查、边界检查以及正确使用free。强调了内存泄漏的严重性并提醒程序员应避免这些错误。
摘要由CSDN通过智能技术生成

常见的动态内存错误



前言

我们在动态内存开辟的时候,偶尔会写出一些bug,但是这些bug都是什么呢?在什么情况
我们会写出bug呢?在这里有哪些易错的点呢?我们应该如何避免写出bug呢?本篇文章,我会给大家介绍动态内存管理中常见的六个应该注意的问题


一、对NULL指针的解引用操作

代码如下(示例):

int main()
{
	int* p = malloc(1000);
	int i = 0;
	for (i = 0; i < 250; i++)
	{
		*(p + i) = i;
	}
	return 0;
}

在这段代码中如果不对p进行NULL判断可能会出现对NULL解引用访问的问题。
在这里插入图片描述
这种问题的解决办法就是:对malloc函数的返回值进行NULL判断

代码如下(示例):

int main()
{
	int* p = malloc(40);
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i;
	}
	//对malloc开辟的空间进行使用....
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	free(p);
	p = NULL;
	return 0;
}

注意:最后不要忘了 free( p ) 和 p=NULL 哦!


二、对动态开辟空间的越界访问

如果在刚才的代码中加一个等号,如图,会发生什么现象呢?
在这里插入图片描述
在这里加上等号之后就会发生这种现象!
在这里插入图片描述

很明显,这里出现了越界访问的问题。
解决的办法:对内存边界要严格地检查!


三、对非动态开辟内存使用free释放

代码如下(示例):

int main()
{
	int a = 10;
	int* p = &a;
	//...
	free(p);
	p = NULL;
	return 0;
}

在这里插入图片描述

free只能释放动态内存开辟的空间,那么有很多人会问,a的空间怎么释放?这个问题很简单,首先a是一个局部变量,局部变量的生命周期是进入作用域创建,出了作用域就直接销毁了!但是malloc开辟的空间要用free来释放


四、使用free释放一块动态开辟内存的一部分

代码如下(示例):

int main()
{
  int* p = (int*)malloc(100);
  if (p == NULL)
  {
   perror("malloc");
   return 1;
  }
   //使用
   int i = 0;
   for (i = 0; i < 10; i++)
  {
    *p = i;
    p++;
  }
    //释放空间
    free(p);
    p = NULL;
    return 0;
}

这段代码相信很多人看来都是没有问题吧~
在这里插入图片描述
那么这段代码是如何出问题的呢?
在这里插入图片描述


五、对同一块动态内存多次释放

代码如下(示例):

int main()
{
	int* p = (int*)malloc(100);
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	free(p);
	//又写了一大段代码......
	free(p);
	p = NULL;
}

在这里插入图片描述
这样也出现很严重的后果,所以一定要尽量避免!!!


六、动态开辟内存忘记释放

代码如下(示例):>

void test()
{
	int* p = (int*)malloc(100);
	//忘记free释放
}
int main()
{
	test();
	while (1)
	{
		;
	}
	return 0;
}

调用完test函数之后p的地址也跟着一起销毁,并且malloc开辟的空间也没有被free释放掉,
这样就会产生内存泄漏的问题!

内存泄漏是很危险的事情,当内存被消耗干的时候,操作系统就无法完成正常的运转!

总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了动态内存管理的六个常见的错误以及各自的解决办法和如何避免这种错误,如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值