经典的笔试题解析:内存泄漏问题忘记free与非法访问的问题

举报
念君思宁 发表于 2023/02/10 20:12:05 2023/02/10
【摘要】 经典的笔试题解析:内存泄漏问题忘记free与非法访问的问题

对于《高质量C/C++编程》,想必这个已经是早已成名的经典书籍了!!在此,笔者借用两三个题目!!

在之前笔者就已经拙作两篇:有兴趣的各位老铁,可以进行欣赏一下啦!!

1.经典的笔试题解析《高质量C/C++编程》

链接为:经典的笔试题解析《高质量C/C++编程》_念君思宁的博客-CSDN博客

2.经典的笔试题解析(返回栈空间地址的问题)

链接为:经典的笔试题解析(返回栈空间地址的问题)_念君思宁的博客-CSDN博客

请各位老铁欣赏一下,下面的简短代码:

1.内存泄漏问题忘记free!!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
void getmemory(char** p, int num)
{
	*p = (char*)malloc(num);
}
 
void test()
{
	char* str = NULL;
	getmemory(&str, 100);
	strcpy(str, "hello world");
	printf("%s\n", str);
	//忘记释放
}
 
int main()
{
	test();
	return 0;
}

上述的代码,并没有多少错误,只不过就是忘记释放掉malloc开辟的空间罢了!!!

不过当运行一个较大的程序的时候,每次都申请空间而不去释放,可能会导致内存不足,从而……卡机!!!所以一定不要忘记释放动态内存开辟的空间!!!

 

2.非法访问问题!!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
void test()
{
	char* str = (char*)malloc(100);
	strcpy(str, "hello");
	free(str);  //在这里,已经释放掉str了!!
 
	if (str != NULL)
	{
		//str此时为野指针!
		//在这里进行非法访问!
		strcpy(str, "world");
		printf("%s\n", str);
	}
}
 
int main()
{
	test();
	return 0;
}

对于这个代码,在函数没有结束就已经使用:free(str); free完以后,malloc函数开辟的100个字节的空间,已经还给操作系统了,且str指针不会自动置为NULL(空指针)!!故此时,str为野指针!!!在后面进行strcpy(str, "world")拷贝的时候,就会进行非法访问!!

温馨小提示:

free完以后,一定要将指针置为NULL(空指针),否则这个指针,就为空指针!!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。