00:00
各位同学,我们再来总结一下动态内存分配的一些基本基本原则,就是注意需要,呃,需要同学们注意什么地方,那么我们在进行动态内存分配的时候呢,避免分配大量的小内存块,也就是说不要在我们这个分配的过程中,你分配了很多这种比较碎的小的这种块,一一块这来一块,比如说咱们在这个内存块里面啊,你分配了一个这个,然后呢,你又紧接着又分配了几个小块。就是这个小块太多了,过后呢,不利于我们管理,明白这意思吧,就是说我们尽量要避免这个问题,这是第一个需要同学们说啊,知道的。分配堆上的内存呢,有一些系统开销,所以分配许多小的内存快,比分配几个大的内存快,系统呃开销要大,就你老区分配小的,它这个是需要是需要有开销的,这样呢,我们系统性能就会降低,第二个呢,仅在需要时分配内存。
01:04
只要使用完堆上的内存就要及时的释放。这些就需要。需要及时释放,否则我家说啊,否则可能出现出现什么呢,内存泄露。OK,那么什么叫内存泄露呢?我跟大家举个例子,大家就一下明白了。打个比方说,呃,同学们看,我还是回到这句话,嗯,你看啊,我们这帮用完了过后,为什么我要加freep呢?假如我们这没有这句话。我们没有这句话的话,就意味着我们这个内存开辟的这20个字节是一直在这使用的。就一直在这儿使用,实际上呢,你有可能只是用一次以后就不用了,但是不用这个空间可是被他已经占用的,明白这个意思吧,那你不用又占用这个空间,显然这个地方就会出现什么呢?浪费,而且有一种可能性,可怕的问题是假如你在用的过程中,在用的过程中,这个PP这个指针,P指针你也不知道,呃,在哪里定义的,因为我这个代码呢,比较少啊,一看就看到了,将来你们你们写代码的时候呢,有可能是这样子的,你这有一个函数F1,这有个函数F2。
02:23
这有个函数F3,举个例子哈,然后呢,F1调用F2 f2调用F3,对,那假如说我们的这个内存呢,是在F1开的一个动态,动态开辟的一个内内存,然后呢,你把这个内存传给他了,他用了,他用了过,按理说他应该他应该释放,但是它没有释放,他没有释放呢,好在了F3这个函数的时候呢,他也不会去释放。那最后就造成一个什么情况呢?本身F1的设计者,F1的设计者他是认为你应该释放,但是你没有释放,你没有释放的话,F3在用的时候他也不去释放,当然F3有可能并没有去用你这块内内内存啊,但是因为种种原因你没有去使用而没有去释放,那么这个内存就怎么样呢?就一直存在我们的堆区。
03:17
那就相当于我们什么呢?相当于我们这个内存就泄露了,就相当于说你泄露内存,内存就少了,没有用上了。第三点呢,总是要确保释放,那总是确保释放已分配的内存,在编写分配内存代码时,要确定在代码的什么地方释放内存,就是刚才老师说的一个例子。你一定要明白是你去释放还是调用着去释放,否则这个内存呢就有可能泄露。最后一点就是在循环分配内存的时候尤其要小心。只是现在同学们可能还没有这样的感受,就是假如我们分配内存是在一个for循环中分配的,那就需要特别的小心,因为你这个for循环呢,可能在释放某一段内存的时候,它会无意中覆盖堆已经分配的内存地址,那这样子的话呢,另外一个地址来使用的时候就用不上了。
04:17
所以说我们说在循环分配内存时要特别小心。啊,当然这些原则呢,其实你重点就要记住两个原则,第一个原则我标出来哈,尽量避免分配大量小的这个内存块,这是一个原则,必须记住。第二点,使用完对象的内存块要及时的释放。这两点只要记住啊,就是最关键的了。啊,尤其是第二点用完了过后就释放,最好是谁用谁释放的规则,也就是说我们要遵守一个这样的规则,在C语言中哈,如果使用动态分配内存。需要遵守,遵守一个原则,什么原则呢?谁应该是谁,谁这个分配谁分配谁。
05:13
谁谁什么呢,谁释放。释放。也就是说,你。你因为你将来这个程序呢,是有好几个人在写,有张三李四王五,那王五开的这个内存,那王五就释放。如果你不释放,你一定要有相关的注释和说明,告诉谁来释放。否则这个内存就会泄露。第二点,我们再来看一下指针的一个使用一览。那么这里呢?我把指针的使用的各种情况都写上来,大家来过一遍哈。In特I这个不讲了,就是一个整形变量in特形P,这是什么东西,能告诉我吗?这是一个呃指向,它是定义P为指向整数数据的指针变量,是不是int新呢?其实它的类型就是特新。
06:04
好,我们再来看一个,这个是什么,这是一个数组,不讲了,这个是什么能看出来吗?哈,这个是一个指针数组。是不是这是个指针数组啊,它是由四个指向整形数据的指针元素构成的,也就是说这个数组呢?哎,这个数组里面有四个元素。这四个元素呢?OK,这四个元素就是这四个元素,它指向的是什么呢。四个int类型的数据啊,就这个意思。还有一个这个大家知道是什么好,这是大家看清楚啊,后面有个中括号,前面有个小括号括起来的。这个是PV指向包含四个元素的一维数组的指针变量,也就是说现在这这个元素它指向的是不是一个简单的int,而是一个一个数组了。明白这个意思吧,后面是个数组,这个是什么?这就是一个普通函数,就不讲了,这个是什么?
07:03
哎,这个是我是不是前面讲过,这个是,嗯,这个是返回一个指针的函数,我们叫指针函数是不是。刚刚讲过的指针函数,这个是什么呀?这个是函数指针。为什么函数指针呢?因为P是指向函数的一个指针吗?所以它是函数指针啊,这个指针大家能看出来,它是这个函数指针,它是指向怎样一个函数呢?是指向一个返回值为int的,没有输入的啊,这样一个函数看到没有,这个是什么?能看出来吗?这是个二级指针。这个能看出来是什么,这是一个VO的,就是VO的心这样的一个类型的指针,它是一个纯地址,注意啊,这个是个纯地址,它并不指向具体的数据,千万不要这样写啊,比如说你有一个VO的星号,一个P。对,然后呢,你有个地址,然后你就用星号P想去获取到它指向的值,这个是错的。
08:04
明白了吧?啊,这点大家清楚,你只有把这个P转成了一个特星或者恰星,然后在另外的一个指针再用星号P来取值,好同学们,那关于指针这个动态,呃,内存分配呢,我们就讲这些,我们把讲的内容梳理一下。我们讲了哪些内容哈,我们梳理梳理。那么这块呢,我们讲的是动态内存分配,我们来梳理一把。跟上老师思路梳理。好,那动态内存分配呢?首先我们说了一下,在C语言中,什么时候咱们可能用到动态内存分配呢?比如说我们需要在堆开辟一个空间,里面放一些临时使用数据,使用完了功能我就释放了,诶这个时候我们就会用到动态内存分配,是不是好梳理在这里。那这是我们讲的第一点。放到这儿来。
09:00
列一个标号,对。对,那么这个图我也顺便给他拿过来哈。这个图是不是在这儿也有一个,其实以前也也说过这个图。就是这个数据放在放在堆里面的啊,这个说完了过后是不是给大家讲一下我们呃用到的呃,动态内存分配的相关的几个函数,对我说了一下。梳理到这儿。那首先我们要非常清晰的知道这些函数是放在哪里的呢?哦,这个太多了,呃,放在这这个函数里面的include。头文件是在standard library这个头文件里面放的哈,我梳理一下第一个。啊,这个这个要保留哈,这个要保留,这个不要。这个表。这这个地方呢,我们有三点说明,所以说我给它来一个这样的符号就可以了,对不对,好看这个又讲了一个这样的哦CC local这个干它是它的作用是什么呢?我们来看一下。
10:02
好,这个呢,我们也把它去一下,它的作用呢,是分配一个,呃,就是N乘以S值的,N乘以S值的这么一个连续空间,相对来说这种空间会比较大,主要是用来做分配数组的时候使用好。这是c local,那这个讲完了过后呢,是不是同学们我们又给大家讲了一个什么呀,讲了free free是释放我们开辟的一个空间,还有一个re local real real local呢是这个P的地址不变化,只是它的空间大小发生变化,对不对?好也给大家梳理到这。好,我在这儿整理一下哈。这边呢,就是这个,我给大家来一个编号,诶这地方还不行,这边变成四才对四。好是,然后呢,这边有几个小点,给他来一个。对,小点来一个,然后紧接着我们是不是讲了第五个,第五个a local。
11:02
Real就是重新分配这个空间的大小,对,但是它的这个手地址并不变化。把这个说完了以后,我们是不是说了一下返回类型呢?诶这个类型呢,很重要,就是贸易的心,这个是干什么的,来写到这来。六。那么这边我们提到了贸易的新,它是一个不确定指向什么数据类型的时候,我们用贸易的新。好,这边呢,继续梳理对吧,包的新指针,我们又这还有一个图片也拿过来放这就可以了。好,这些图片我们就放在一起好吧。然后这边呢,也是一个图片,就是说在高版本的呃地方呢,它可以自行的转换,但是我们低版本的编译器还是需要强制转换一下。好,放这就可以了。好,这个说完了哈,说完过后是不是我们就给大家举了一个案例啊对,举了一个案例,我们来使用了一下动态分配内存的,呃,这个情况好,然后呢,我把这个代码给大家整理到这边来,代码演示,还有示意图代码演示。
12:09
好,代码演示,来一个这样的图标,代码演示在哪里呢?就这。是不是?把这个代码呢,给各位朋友放到我们的这个笔记里面去,然后呢,对应的示意图我拿过来是这个图很重要的啊,这个图呢是非常有指导意义的。我把这个图呢给大家拿过来。好,这是一个内存分析图。好的,我直接放这好吧,这样标成一个出题吧。标签和出题,引起大家一个重视。好,那然后这边这个案例讲完了,是不是又给大家梳理一下我们动态分配,呃,动态内存分配的使用的几个原则啊,这里面尤其是要注意两个原则,前面我这标出来的哪两个原则呢。这第一个原则就是我们要尽量避免分配大量的小的内存块,第二个呢,要遵守使用完这个堆。
13:09
啊,用完这个堆过后要及时的释放,遵守的规则是谁使用谁释放,否则就会出现内存泄露。啊,就有可能出现内存泄露,最后第五一点,第五一点是不是我们梳理一下指针使用的各种情况,比如说函数指针,指针函数啊等等等等,对吧,是一样,还有多极指针,我们就这个图就把它情况说清楚了。好,我把这个图呢给大家粘过来。好,各位同学,那关于我们这一个什么呀,叫做指针的内容就全部讲完了。那么大家呢,可以在老师讲完过后,把我们讲的内容梳理梳理,自己呢,写点笔记啊,画一个什么老图啊,或者思维图,加强一个记忆,后面呢,我们还会做相关的项目,来加强对前面讲的各知知识点的一个综合使用。
14:01
各位同学,这一讲指针的内容就给大家介绍到这里。
我来说两句