《C语言深度剖析》第五章 内存管理 p1(完结)( C语言从入门到入土(进阶篇)(二)

简介: 本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始!

4.2. 可以用memset来初始化

0.png


4.3. 内存泄漏如果程序退出了,问题还在吗?

1.png


答案是当一个程序开辟了很多空间但是没有去释放,发生内存泄漏,但是如果程序结束,操作系统会强制把开辟的内存回收,也就是释放内存,所以是不在了。(注意不是编译器回收哈,因为代码运行起来之后就和编译器没有关系了)


那问题又来了,那什么程序最怕内存泄漏,就是那些不会主动退出的程序或者说很少主动退出的程序。(一般常见的有:操作系统,杀毒软件,服务器程序)(我们把这种经常性得使用的程序称为常驻(内存)进程(程序))



4.4. 内存开辟实际上比我们预要开辟得多,为什么?




2.png3.png

我们可以发现,我们free的时候只知道起始地址,并没有说要释放多少字节


这是执行free语句的结果

4.png

但是我们free的时候发现变红的远不止20个,也就是说释放的远不止20个空间,也就意味着曾经申请的空间一定比20个字节多(这个多(kookie)是个固定的值,但是看编译器等)。多出来的部分其实是记录这次申请的更详细信息(申请空间多大,申请时间等)。再多说一句,所以申请大空间比较好,因为kookie的比值就小,而刚好申请小空间我们用栈,所以刚好互补。


4.5. 内存释放的本质上是什么?


5.png6.png


我们发现释放前和释放后p的值没变。那此时还能访问堆空间吗?


答案是不能,为什么呢?


这里来一个例子,假设你心中有一个女朋友的变量空间,里面开始什么都没有,后来喜欢上了一个人,然后你们在一起了,她的名字就在我们的变量空间里面,但是后来因为某种原因,她不喜欢你了,分手了,这就相当于free,但是她的名字任然在我们之前的空间里面,但是我们不能再去找她玩了,因为我们现在没有关系了,这个free就相当于取消了我们之间的关系,再去找她,就相当于野指针访问了!


那free会不会将p置为空?


其实是不会的我们发现,为什么呢?因为此时用p再访问已经就是非法访问了,此时对系统没有影响,影响的只是我们自己的程序(分手后走不出来,和前女友没有关系,伤害的是我们自己啊QAQ),所以系统并没有强制设定为空,但是我们自己并不想这样,因为可能会出错(可能走不出来),所以我们free之后常把他设置为NULL(封心封心)。


5. C中动态内存“管理”体现在哪

在今天的学习中,我们有效学到的函数是malloc和free,能够进行有效的空间申请和释放了

那么,通常书中所说的内存“管理”体现在哪里呢?难道就是malloc和free?

内存管理的本质其实是:空间什么时候申请,申请多少,什么时候释放,释放多少的问题。

1. 场景:C的内存管理工作是由程序员决定的,而程序员什么时候申请,申请多少,什么时候释放,释放多少都是有场景决定的(比如上面的链表操作),而大部分书中,是讲具体操作,很少有场景,所以管理工作体现的并不直观。不过我们现在能理解即可。

2. 其他高级语言:像java这样的高级语言,语言本身自带了内存管理,所以程序员只管使用即可。换句话说,内存管理工作,程序员是不用关心的。但是C是较为底层的语言,它的内存管理工作是暴露给程序员的,从而给程序员提供了更多的灵活性,不过,管理工作也同时交给了程序员。

所以,因为上面的两点,C中内存章节,基本都叫做内存管理

在C中,程序员+场景=内存管理


今天的内容就到这里了哈!!!

要是认为作者有一点帮助你的话!

就来一个点赞加关注吧!!!当然订阅是更是求之不得!

最后的最后谢谢大家的观看!!!

你们的支持是作者写作的最大动力!!!

下期见哈!!!

相关文章
|
2天前
|
存储 程序员 编译器
C语言:动态内存管理
C语言:动态内存管理
9 1
|
2天前
|
存储 编译器 程序员
C语言:数据在内存中的存储
C语言:数据在内存中的存储
9 2
|
2天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
10 2
|
10天前
|
存储 C语言 开发者
【C言专栏】C 语言实现动态内存分配
【4月更文挑战第30天】C语言中的动态内存分配允许程序运行时按需分配内存,提供处理未知数据量的灵活性。这涉及`malloc()`, `calloc()`, `realloc()`, 和 `free()`四个标准库函数。`malloc()`分配指定大小的内存,`calloc()`同时初始化为零,`realloc()`调整内存大小,而`free()`释放内存。开发者需谨慎处理内存泄漏和指针使用,确保程序的稳定性和性能。动态内存分配是C语言中的重要技能,但也需要良好的内存管理实践。
|
11天前
|
存储 程序员 C语言
C语言进阶第九课 --------动态内存管理-2
C语言进阶第九课 --------动态内存管理
|
11天前
|
编译器 C语言
C语言进阶第九课 --------动态内存管理-1
C语言进阶第九课 --------动态内存管理
|
16天前
|
程序员 编译器 C语言
C语言知识:动态内存管理(malloc free calloc realloc)
C语言知识:动态内存管理(malloc free calloc realloc)
|
16天前
|
存储 编译器 C语言
C语言基础知识:数据在内存中的存储解析(整数,浮点数)
C语言基础知识:数据在内存中的存储解析(整数,浮点数)
|
15天前
|
Linux
Linux rsyslog占用内存CPU过高解决办法
该文档描述了`rsyslog`占用内存过高的问题及其解决方案。
40 4
|
1月前
|
移动开发 运维 监控
掌握Linux运维利器:查看CPU和内存占用,轻松解决性能问题!
掌握Linux运维利器:查看CPU和内存占用,轻松解决性能问题!