处理程序内部指针互指的问题

第一种方法:
两个原则:
1、使得一者的生存期大于另一个,主要是严格的控制释放时机的先后关系;
2、释放时机严格早的一方可以访问释放实际严格晚的一方的内部成员,而不能反过来,亦即不能使用释放时机晚的内部成员指针
访问对方的内部成员。。
其他的一些控制都是浮云。。这两个保证很有效
智能指针的使用还有待商榷,继续考虑如何在程序中使用,这一块的控制很成问题,一个不好,也是满盘皆输
第二种方法:
采用另一种方式:引用计数。
对一个对象置计数值初始0,然后addref、refdel来修改,query获取,值为0时可以释放,初始一个valid值true,该释放时为false
原则:
(1)保证一方的释放另一方通过一定的方式一定可以判断出来,
(2)在获取一方指针并意图使用的过程中,(a)如果不为空,(b)先将引用计数加一,(c)然后判断其是否可用,可用则加一再减一返回,否则直接减一返回,
使用完再减一即可
(3)对象释放过程中,先判断是否可用,如果可用然后判断引用是否为0,再释放并置对端指向自身的指针为空
(这中间也存在获取对端合法指针的问题,先获取指针,并保证可用后修改其值,而且需要注意一点:该操作与获取指针的操作需要互斥)
这样a保证未完全释放(如完全释放会置对端指向自身的指针为空),b保证如未开始释放,不准释放,
如开始无效果,那么后面会保证不允许使用
c判断是否可用,保证如果正准备释放则不可使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值