前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >内存四区,malloc,内存操作注意事项

内存四区,malloc,内存操作注意事项

作者头像
大忽悠爱学习
发布2021-03-02 14:48:32
8780
发布2021-03-02 14:48:32
举报
文章被收录于专栏:c++与qt学习

内存四区

在这里插入图片描述
在这里插入图片描述

注意内存小于4个字节,会放入寄存器上

malloc函数

在这里插入图片描述
在这里插入图片描述

注意:在堆区开辟内存的时候,内存就已经随机赋值了,因此可以用memset清空内存

在这里插入图片描述
在这里插入图片描述

内存操作注意事项

1.不要返回局部变量的地址 vs编译器会先保留一次局部变量地址,防止程序员误操作 内存已经被释放,再操作属于非法行为 注意返回地址用指针接收,与返回值用变量接收的区别:

  1. 指针接收地址,相当于指针指向了内存的地址,但是因为是局部变量被释放了,操作权限还给了操作系统,可能会拿给其他程序使用,虽然此时指针依旧指向该地址,但是很可能内存就被其他变量占用使用,不再是a变量的值10
  2. 返回值的话,执行的是拷贝复制操作,因此相当于是变量b的值变成了10,变量a被释放,但是变量b还没被释放
在这里插入图片描述
在这里插入图片描述

解决方法:返回静态变量,静态变量生命周期直到程序结束

在这里插入图片描述
在这里插入图片描述

2.不要操作已经释放的内存空间 不能再释放后*p=2000;再次操作释放的内存空间

在这里插入图片描述
在这里插入图片描述

free(str)后指针仍然指向原来的堆地址,即你仍然可以继续使用,但很危险,因为操作系统已经认为这块内存可以使用,他会毫不考虑的将他分配给其他程序,于是你下次使用的时候可能就已经被别的程序改掉了,这种情况就叫“野指针”,所以最好free()了以后再置空 str = NULL; 即本程序已经放弃再使用他。 何谓“野指针”,在这里补充一下。

野指针是指程序员或操作者不能控制的指针。野指针不是NULL指针,而是指向“垃圾”的指针。 造成“野指针”的原因主要有 1.指针变量没有初始化,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。在初始化的时候要么指向合法的指针,要么指向NULL。 2.指针变量被free或delete之后,没有设置为NULL。它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。上文DEMO则是这种情况。 3.指针操作超越了变量的作用范围。 注意其生命周期。

3.不要重复释放一块内存

free释放的不是指针,而释放的指针指向的内存空间。free之后,如果指针又指向了另一块内存空间,可以直接使用该内存空间的数据。而如果free之后指针没有指向其他内存空间,也没有指向NULL,依旧指向着已被释放的内存空间,所以操作数据会出错。一般在free之后都需要重新指向新的内存空间或NULL

在这里插入图片描述
在这里插入图片描述

解决方法:

代码语言:javascript
复制
void fun()
{
	int* p = (int*)malloc(sizeof(int));
	if (p != NULL)
	{
		free(p);
		p = NULL;
	}
	//空指针也可以释放
	free(p);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 内存四区
  • malloc函数
  • 内存操作注意事项
  • 3.不要重复释放一块内存
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档