C语言动态内存管理的六大常见错误

前言

小编相信各位道友在日常写C语言代码的时候肯定离不开动态内存的使用,但各位道友真的正确使用动态开辟的内存了么?因此本期小编将带领大家回顾C语言动态内存管理的常见六大错误。


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

错误样例:

void test()
{
	int* p = (int*)malloc(INT_MAX / 4);
	*p = 20; //如果p的值是NULL,就会有问题
	free(p);
}

分析:

 对于开辟动态内存空间的函数,诸如malloccallocrealloc,他们在开辟空间失败的时候会返回空指针NULL,因此我们每次在使用开辟动态内存空间的函数的时候,我们都应该对返回值进行检验,避免后续出现对空指针的引用,而导致程序出错。

正确样例:

void test()
{
	int* p = (int*)malloc(INT_MAX / 4);
	//判断p是否为空指针
	if (p == NULL)
	{
		return;
	}
	*p = 20; 
	free(p);
}

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

错误样例:

void test()
{
	int i = 0;
	int* p = (int*)malloc(10 * sizeof(int));
	if (NULL == p)
	{
		return;
	}
	for (i = 0; i <= 10; i++)
	{
		p[i] = i; //当i是10的时候越界访问
	}
	free(p);
}

分析:

因为我们malloc开辟的空间为10个int类型的空间,因此当i为10的时候越界访问了,因此在使用动态开辟的内存空间的时候,要时刻关注开辟的内存大小以及注意访问的时候不要越界,否则程序会出现非常大的BUG。

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

错误样例:

void test()
{
	int a = 0;
	int* p = &a;
	free(p);
}

分析:

 该样例中free释放了非动态开辟的内存空间p,而free这个函数就是释放动态开辟的内存空间的,不可以释放非动态开辟的内存空间,因此错误。而这个样例中可以清楚的察觉到free释放了非动态开辟的内存空间,这个我相信各位道友肯定不会犯这个错误,当当我们再写大型程序的时候,加上变量名的增多,我们就可能free释放非动态开辟的内存空间,因此需要我们提防。

扫描二维码关注公众号,回复: 15670639 查看本文章

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

错误样例:

void test()
{
	int* p = (int*)malloc(100);
	if (p == NULL)
	{
		return;
	}
	p++;
	free(p);//p已经不再指向动态内存的起始位置
}

分析:

 当我们开辟好动态的内存空间后,不要轻易的改变指向动态内存首地址的指针的值,因为我们一旦改变后,其将不再指向动态内存的首地址,导致我们后续在free释放的时候无法释放完全,导致内存泄漏。

5、对同一块内存的多次释放

 错误样例:

void test()
{
	int i = 0;
	int* p = (int*)malloc(10 * sizeof(int));
	if (NULL == p)
	{
		return;
	}
	free(p);//第一次释放
	for (i = 0; i < 10; i++)
	{
		p[i] = i;
	}
	free(p);//第二次释放
}

分析:

 当我们第一次使用free释放掉开辟的动态内存后,该动态内存将归还给操作系统,因此在free释放掉后,任何对该动态内存的再使用都将是非法访问,同时第二次free的时候也会导致free函数出错,而导致程序无法正常运行,因此在使用动态内存开辟的时候要考虑清楚合适释放,同时杜绝多次释放。

6、内存泄漏(动态开辟内存忘记释放)

 错误样例:

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

分析:

 因为test()函数中进行了动态内存开辟,但没有进行动态内存释放,因此在使用这个函数的时候就会占用内存空间,同时若反复使用这个函数,会导致内存最终被占用完,导致程序崩溃,因此一定要谨记动态开辟的内存空间要free释放。


总结

动态内存一定要合理使用,并且正确释放。

以上就是小编为大家总结的C语言动态内存管理的六大常见错误。制作不易,还请各位道友可以三连至此一下,后续会有更加精彩的内容。谢谢!!

猜你喜欢

转载自blog.csdn.net/m0_70322372/article/details/127361052