开篇前的碎碎念
本文详解动态内存管理中内存泄露问题:
笔者是一个酷爱刑侦小说的不合格的大学生,有时会对故事情节痴迷地死去活来以至于恨不得一口气读完甚至上课也旁若无人地看,余华先生曾有言:一本真正的好书,有两种阅读方式,一种是你巴不得一口气废寝忘食地读完,另一种是像掰玉米粒一样一点一点读,生怕一下子就看完了,笔者显而易见就是前者。
《心理罪-暗河》中有段情节可以给读者朋友们打比方,便于各位的进一步理解
正文开始
一、小说部分情节
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;
}
任务管理器查看结果
四.结语
我今日所做的事远比我往日的所作所为更好,更好;我今日将享受的安息远比我所知 的一切更好,更好。 ———— 《双城记》