C++晋升之配对编程

我们在创建了指针没有初始化或者指针释放了还要用或者指针返回了指向栈内存的指针或者引用的时候编译器会报错,因为野指针

对象用过后不再用没有释放造成内存泄漏

避免野指针和内存泄漏用配对编程和指针赋空结合来安全释放已经不再使用的内存

为什么要配对编程?为什么要指针赋空?

先来说指针赋空吧:

指针赋空有两种,一种是为了初始化指针,这样很好理解,将指针清零然后来使用

而我们说的是在指针指向的空间不再使用的情况下指针为什么赋空

指针中的值编译器作为内存来翻译,查找物理内存

物理内存4G,前两个G操作系统使用,后两个G我们可以申请使用(不足两个G,栈还有1M)

我们detele指针只是将指针指向的空间的使用权豁免,但是空间仍然存在,数据仍然存在,空间的地址我们在指针中也有痕迹

这时候将指针赋空,指针中原本是新开辟空间的地址,赋为0(赋为1,2,3……也行,只要是系统申请的空间)0是4G空间第一个地址,如果我们还要使用的话系统会报错

所以释放空间后在指针赋空,加了一行代码降低运行效率提高找错的效率

配对编程(有三对):

第一对:new&&delete

这一对我们也是最为熟悉的,通常构造中new了析构中delete

第二对:retain&&release(内存引用计数)

解决的问题是:多个 对象 成员指针 用一个对象(其他指针在使用,你释放了的问题)

想象一下是什么样的问题:多个对象的成员指针指向的是同一块空间,只有一个成员指针new了,用引用把地址传给其他指针,其他指针还在用,不知道啥时候用完,所以不能哪个成员指针new完后使用完后delete(除非你看内部代码)

怎么解决的:retain封装的一个函数,如果传了引用,就有一个状态++,这个指针用完就去调release,这里面状态--,最后判断release里面状态只要为空就delete,release函数里有delete

所以:谁拥有谁就去释放,retain和release的调用次数是相同的

第三对:release&&autorelease(自动释放)

需要:Autorelease Pool(自动释放池)

autorelease是对release的拓展

解决的问题:在方法内新建对象,将对象返回时遇到的问题,弥补内存引用计数的缺陷,要是你new了就release,计数变为-1了,释放了且无法返回新建的对象

实现:函数里new后调用自动释放,给这个对象做一个标记,加在池里,仅此而已,然后在延长一段时间(不清楚,也许是一个进程切换到另一个进程,这个类),然后会释放掉释放池,池里做过标记的都会掉一次release

所以:是谁new谁去释放(又叫延迟释放,引用给别人,别人不需要管释放)

补充:A来new,new出来空间的地址引用给B,然后A调自动释放,B调release传给C,C调自动释放传给D,D调release

问:谁释放指针

答:C

解:自动释放机制,自动释放中有返回,将引用的指针返回到池中(动态数组),自动释放的机制,A先返回,所以A的下标小于C,这里有个机制,for循环,从0开始,那么就先找到下标小的A,然后--,然后找到c,来delete

改题:A和C不在一个池中

答;A

解:池存放于栈里,先进后出

(PanPen120原创 如有建议 请留言)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值