动态内存管理的常见问题

动态内存错误

对NULL指针的解引用操作

#include<stdio.h>
#include<errno.h>//perror的头文件
#include<limits.h>//INT_MAX的头文件
int main()
{
	int* p = (int*)malloc(INT_MAX);//INT_MAX是21亿多
	if (p == NULL)//太大没有开辟成功,导致返回值为空指针,所以判断一下
	{
		perror("malloc");
		return 1;
	}
	//释放
	free(p);
	p = NULL;
	return 0;
}

结果就是没有足够的空间
在这里插入图片描述

#include<stdio.h>
#include<limits.h>//INT_MAX的头文件
void test()
{
	int* p = (int*)malloc(INT_MAX);
	*p = 20;//如果p的值是NULL,就会有问题
	free(p);
}
int main()
{
	test();
	return 0;
}

结果
在这里插入图片描述

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

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)malloc(20);//20个字节-5个整形
	if (p == NULL)//判断
	{
		return 1;
	}
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		*(p + i) = i;//20个整形
	}
 	for(i = 0; i < 5; i++)
	 {
		printf("%d ", p[i]);//申请了5个整形,但是使用了20个整形,程序崩掉,越界访问了
 	}
 	//释放
	free(p);
	p = NULL;
	return 0;
}

这个代码没法进行运行,会直接崩掉,所以我就展示崩掉的代码了

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

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int num = 10;
	int* p = &num;

	free(p);//编译器无法理解你在释放什么
	p = NULL;//程序崩掉
	return 0;
}

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

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)malloc(100);//100个字节
	if (p == NULL)
	{
		return 1;
	}
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		//*(p + i) = i;//起始地址不变,动态内存开辟一定要保证起始位置不变
		*p = i;//起始地址变了,导致释放不完全
		p++;//是错误的行为,程序直接崩掉
	}
	free(p);//释放时,p指向的不是起始位置
	p = NULL;

	return 0;
}

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

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)malloc(100);//100个字节
	if (p == NULL)
	{
		return 1;
	}
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		*(p + i) = i;
	}
	free(p);
	p = NULL;//如果这里没有把P置为空指针,那么程序就会崩掉

	free(p);//如果置为空指针之后再次释放
			//那么函数什么事都不做,所以一定要记得将函数置为空指针
	return 0;
}

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

#include<stdio.h>
#include<stdlib.h>
void test()
{
 	int *p = (int *)malloc(100);
 	if(NULL != p)
 	{
 		*p = 20;
 	}
}
int main()
{
 	test();
	while(1);//程序会一直进行下去,导致内存损耗,最后崩掉
}

所以,在进行动态内存的使用时一定要记得进行判断,释放,赋空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青青丘比特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值