00:00
嗯,针对于我们说的内存泄露啊,咱们再给大家举两个案例啊,这两个案例呢,有利于大家呢,进一步的去理解这个内存泄露的问题,哎,包括呢,在这里边我们也再看一看关于这个,呃,大部分文件的一个使用啊,如何去发现这个内存泄露的问题啊。好,那我们先来看一下这个第一个案例啊,第一个案例呢,对应的我们这个是一个stack啊,相当于我们这块呢,自己创建了一个站是吧?哎,关于它啊,好大家来看一看这个例子。嗯,这个例子呢,其实就是我们自己定义了一个占结构啊,里边呢,有真正存数据的这个数组啊,Size一开始是零啊,这呢是它的一个容量,哎,我们构造器当中呢,指定了这个呃数组它的长度呢就是16,好,就是当我们一旦造好这个站的时候呢,它的长度呢,就默认先是16,然后这个push的话呢,就相当于是我们叫入站操作对吧。嗯,250P呢,就是我们这个出战操作。哎,这个应该都很清楚,OK啊,如果这样的话呢,我们就相当于是啊这块多一个操作,就是确保一下我们当前这个速度的容量呢,是不是够啊,如果要是够的话呢,我们直接就添加到咱们这个呃,数组当中,哎,然后让这个size加加就可以了啊size呢,相当于它呢,来记住咱们到底添加过几个元素啊,那inure capacity呢,就是这里边定义的一个。
01:19
如果呢,我们发现啊,发现呢,我们当前这个,呃,已经存储的这个数组的元素和我们呃,已经存储的这个元素和我们数组的长度是相等的。啊,相等了,或者说你这个size更大了是吧?啊,这时候我们就需要做一个扩容,扩容的话呢,我们扩容为原有的容量的二倍加一啊,同时呢,把这个元素呢,还拷贝到我们新的这个数组当中是吧?哎,这个意思啊,好,这呢就是我们说的一个扩容机制,咱们大家看过,呃,A release啊等等他们的底层源码的话呢,都是类似的这样的一个原理啊。呃,这呢是关于一个push啊,这个是入站的操作,这个没毛病,那现在呢,我们来看一下这个PU,就是这个出站的哈,它是有问题的。
02:00
大家看我这怎么写的啊,说呢,如果这个size是零的话呢,就是我们现在相当于站里边根本就没有数据啊,那你这个时候呢,还想出战这个我们就只会抛一个异常啊,这个没毛病啊,关键的看这块儿说,呃,Return一下elements size,这个是前减减啊,就是我们把它呢,这个相应的这个数据呢,取出来之后呢,做一个这个减减是吧,这个操作呢,我们说它是有问题的。哎,这个操作是有问题的,那怎么就有问题了呢?哎,大家你看一下啊。哎,你看我这里边儿这个图。嗯,如果呢,我们往里边呢,去入站操作呢,你就加一个加一个加一个,就一个个加就行,Size呢也跟着是不是往上累加对吧?哎,跟着往上累加好,然后现在呢,我们是想这个出站操作哈,出站操作的话呢,原则上来讲,比如说我们现在泡沫其中的一个,那就是把这个呢,就给移出去了,EIG呢,这个是不是它的引用呢,也应该断掉,这个对象呢,其实是可以考虑回收了,对吧,而现在呢,我们的操作是什么呢?咱们只是让这个指针呢往下移了。
03:03
你看只是呢,这个哎,我们先减减,因为size比如有五的话,我们是找这个索引为四的位置是吧?哎,我们先呢,就是找这个元素四的那个位置,当然这个set也减减了,实际上呢,相当于是什么意思啊,大家应该也都发现了啊,我们这个数组当中数据是不是还是这么多,只不过呢,就是我们这个,呃,泡沫一下,我们这个指针往下移一下,但泡沫一下指针再往下移一下,上面的这个数据是不是依然是存在的呀?啊,这就是问题所在。啊,本来上边呢不应该要了,但是你现在还在啊,这个我们把它呢,这些数据称为呢叫过期引用啊,这个呢,就是一个比较隐蔽的一个泄露问题。比较隐秘的泄漏问题,猛一看的话呢,感觉挺好的是吧,也没啥操作啊,没没啥这个问题,但实际上呢,它是不对的是吧,哎,当你这个。站里边像这些数据呢,比较多的时候啊,比如说你一整几千啊,甚至这个上万的这个数据啊,上面这些数据呢,本身都已经不要了,但事实上呢,它还存在着,这不就是泄露吗。
04:02
对吧,啊,因为这个JC的话呢,还回收不了啊,那应该怎么改呢?哎,我们说呢,就不能这样去写了,哎,我们这儿呢,指明它是存在泄漏问题是吧。泄露,那我们应该改成下边这样子,哎,说白了我们就真实的不应该再要这个数据了,对吧?零的时候呢抛异常,哎,否则的话呢,我们就先把这个数据呢先记录下来,就是你现在呢想给它这个移出站的啊,诶一定要这个泡沫操作呢,最后把这个呢给你返回,就相当于是出站了,哎同时的话呢,我们一定要把你对应的这个位置上的元素啊,且因为刚才已经检减过了哈,把你这个位置上元素呢给它制空,这个时候呢,你对应的那个真实的数据。哎,这个OK,哎调一下这啊,哎,你真实对应的比如指针指到这儿了,你上面这几个数据相当于把这个把它改成no了,这个指针就不在了,那这些数据呢,是不是就会被这个垃圾回收掉了,哎这样的话就不存在这个泄漏的问题。哎,应该这样子去操作啊,这样去操作。
05:00
行啊,这呢就指的我们这个具体的解决和方案啊,行,这呢就我们给大家举的其中的一个案例啊,这个案例的话呢,相当于就是大家对代码层面呢,要敏感一些啊,这个在写代码的时候呢,要小心一些,可能会存在一些比较隐蔽的一些泄露问题啊,这个呢要注意。
我来说两句