《心理罪-暗河》与内存泄漏的千丝万缕

本文通过《心理罪-暗河》的小说情节,比喻解释了内存泄漏的概念,特别是realloc函数的使用和可能导致的内存问题。文中详细介绍了realloc的格式和使用方法,并提供了一个笔试题来判断realloc是否导致越界。同时,通过举例说明了内存泄漏的严重性及其对系统资源的影响。
摘要由CSDN通过智能技术生成


开篇前的碎碎念

本文详解动态内存管理中内存泄露问题:

笔者是一个酷爱刑侦小说的不合格的大学生,有时会对故事情节痴迷地死去活来以至于恨不得一口气读完甚至上课也旁若无人地看,余华先生曾有言:一本真正的好书,有两种阅读方式,一种是你巴不得一口气废寝忘食地读完,另一种是像掰玉米粒一样一点一点读,生怕一下子就看完了,笔者显而易见就是前者。
《心理罪-暗河》中有段情节可以给读者朋友们打比方,便于各位的进一步理解


正文开始

一、小说部分情节

1.前因:

小说的主人公是方木,C市局公安部心理犯罪研究室的成员,他的上司局长邢至森在调查一起跨境儿童拐卖的案子,由于犯罪团伙背后势力巨大,不能明面调查,邢局安排亲信丁树成作为卧底潜入对方团伙。

2.后果:

牵涉利益方众多,犯罪团伙势力巨大,当了一辈子老刑警的邢局被恐吓,女儿邢璐被割去手脚,尸体送回邢局家门口,这是不法分子赤裸裸的挑衅。随后,邢局被犯罪团伙陷害入狱,方木被邢局委托,查明卧底丁的下落,但是邢局在知道真相之前,被监狱里的死缓囚犯刺杀,方木开始调查真相。

二、realloc内存函数

1.格式

int*ptr=realloc(p,40);
//开辟一块40个字节的空间,把40个字节的空间首地址返回指针p,再用ptr来接收

2.使用

int* p = (int*)malloc(20);
	if (p==NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//使用
	for (int i=0;i<5;i++)
	{
		p[i] = i + 1;
	}
	//开辟一块40个字节的空间
	int* ptr = (int*)realloc(p, 40);
	if (ptr!=NULL)
	{
		p = ptr;
	}
	for (int i=5;i<10;i++)
	{
		p[i] = i + 1;
	}
	for (int i=0;i<10;i++)
	{
		printf("%d ", p[i]);
	}
	
	//释放
	free(p);
	p = NULL; 

注意:1.若开辟空间充足,则在原空间基础上继续开辟,p==ptr。
2.如果开辟空间占用其他空间,出现越界情况,则另开辟一块空间,p!=ptr

3.笔试题

写一段代码判断realloc开辟的空间是否越界:

	//判定realloc开辟的空间是否越界
	int* p = malloc(20);
	if (p==NULL)
	{
		printf("%s", strerror(errno));//显示错误信息
		return 1;
	}
	int* ptr = realloc(p, 4000000);//开辟过大,复制原来的数据,free原先的内存,返回一个新的地址

三、内存泄露

malloc,calloc,realloc
所申请的空间,如果不使用,需要free释放
如果不free释放:
程序结束后,也会由操作系统回收
如果不free,程序也不结束,内存泄露
*
p好比就是邢局,开辟的20个字节为卧底,如果邢局去世,那么没人知道丁是卧底,即找不到这20个字节的位置,造成内存泄露
内存泄露是一件很恐怖的事,运行以下代码,没有free(p)

void test()
{
	int* p = (int*)malloc(20);

}
int main()
{
	test();
	

int main()
{
	while (1)
	{
		malloc(20);
	}
	return 0;
}

任务管理器查看结果

在这里插入图片描述

四.结语

我今日所做的事远比我往日的所作所为更好,更好;我今日将享受的安息远比我所知 的一切更好,更好。 ———— 《双城记》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

江财菊圃路彭家桥C++一霸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值