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