- 主题:这种情况下我该不该把unique_ptr改成shared_ptr?
是的 A& 也有dangling ref的问题
【 在 here080 (hero080) 的大作中提到: 】
: A&只是一个必须初始化且无法重定向的A*而已
: A&引用的东西跟指针指向的一样,是否失效不是语言本身保证的。
--
FROM 218.200.160.*
这个靠的是程序逻辑来控制。
你的这个A和B,就是应该使用unique_ptr和裸指针。用shared_ptr和weak_ptr属于典型的滥用。
你还没说清楚为什么你这个会有dangling?如果B指向的A拥有这个B,根本就没有dangling的可能啊?
【 在 fly2never (逆飞的鱼) 的大作中提到: 】
: 标 题: Re: 这种情况下我该不该把unique_ptr改成shared_ptr?
: 发信站: 水木社区 (Mon Jul 26 11:21:18 2021), 站内
:
: 如果不是这种情况呢,A*确实会dangling的时候, 是不是用weak_ptr是最佳实践,还是说, 设置一个set nullptr的接口,主动置空比较好?
: 【 在 here080 (hero080) 的大作中提到: 】
: : 就用裸指针。
: : 尤其是如果你这个B里指向的A对象拥有这个B对象,那根本不会有任何风险。
:
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 218.200.160.*]
--
FROM 76.126.252.*
感谢详细回答.
确实如你所说. 如果我能100%确认不会失效, 那么用 A& 是最好的. 这样语义明确, 不用到处判空.
但是项目大了之后, 很多人写代码, 我在想要不要 强制一个团队规范, 就是不用在成员变量里面使用 raw pointer, 如果有, 就用weak_ptr来代替. 这样就100%保证了不会出问题, 但是代价是性能会降低.
如果让大家自己判断是否会danging,而使用A&的话, 就有风险. 团队技术人员能力有高有低, 就有隐患
【 在 ziqin (子青|会挽雕弓如满月|西北望|射天狼) 的大作中提到: 】
: 如果要一定保证不失效,就只有使用shared_ptr或者weak_ptr
: 楼主的问题是不是要牺牲效率而从代码级别保证访问callback不会出问题
: 如果callback有可能会在B的生存期内失效,那就不需要讨论,直接上weak_ptr
: ...................
--
FROM 218.200.160.*
你说的是对的.
问题在于一个上百万行的repo里面, 每天很多pr, 可能reviewer没有精力去仔细看每一个地方是否可能danging,出于代码安全性考虑, 我在想要不要全部禁止成员变量持有raw pointer, 虽然不合理, 但是省心. 见我前几条回复有说明
【 在 here080 (hero080) 的大作中提到: 】
: 这个靠的是程序逻辑来控制。
: 你的这个A和B,就是应该使用unique_ptr和裸指针。用shared_ptr和weak_ptr属于典型的滥用。
: 你还没说清楚为什么你这个会有dangling?如果B指向的A拥有这个B,根本就没有dangling的可能啊?
: ...................
--
FROM 218.200.160.*
我再强调一遍,A&在设计上并不能对生存期问题有任何“更明确一些”的效果。
A*对生存期有着和A&完全一样的设计效果(因为有所有权的指针都换成unique_ptr了)
【 在 ziqin (子青|会挽雕弓如满月|西北望|射天狼) 的大作中提到: 】
: 标 题: Re: 这种情况下我该不该把unique_ptr改成shared_ptr?
: 发信站: 水木社区 (Mon Jul 26 11:12:39 2021), 站内
:
: 如果要一定保证不失效,就只有使用shared_ptr或者weak_ptr
:
: 楼主的问题是不是要牺牲效率而从代码级别保证访问callback不会出问题
:
: 如果callback有可能会在B的生存期内失效,那就不需要讨论,直接上weak_ptr
:
: 如果callback确保不会在B的生存期失效,并且从楼主的描述来看,callback是在B创建的时候就建立了,并且就是拥有m_b的那个A的instance,那用A&在设计上会更明确一些
:
: 如果callback指向的不是拥有m_b的那个A的instance,那用raw pointer只有从构架上保证callback的生存期比m_b长了。
:
: 需不需要用weak_ptr,还是却决于类的使用环境。如果有一个统一的container来管理所有A instance的生存周期,那用raw pointer就可以。要在完全去耦合,从类的设计上就保证不出问题,肯定是要损失效率的
:
:
:
: 【 在 here080 的大作中提到: 】
: : A&只是一个必须初始化且无法重定向的A*而已
: : A&引用的东西跟指针指向的一样,是否失效不是语言本身保证的。
: :
:
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 36.23.69.*]
--
FROM 76.126.252.*
这是错误的方式。事实上大项目里滥用shared_ptr只会造成更多的问题。
你可以使用一些编译工具和测试工具来减少可能出现的dangling问题。
出于代码安全考虑,我建议你学习google style
这可以有效的排除掉绝大部分坑。
当然了,提高programmer和reviewer的素质是必须的。
【 在 fly2never (逆飞的鱼) 的大作中提到: 】
: 标 题: Re: 这种情况下我该不该把unique_ptr改成shared_ptr?
: 发信站: 水木社区 (Mon Jul 26 11:27:28 2021), 站内
:
: 你说的是对的.
:
: 问题在于一个上百万行的repo里面, 每天很多pr, 可能reviewer没有精力去仔细看每一个地方是否可能danging,出于代码安全性考虑, 我在想要不要全部禁止成员变量持有raw pointer, 虽然不合理, 但是省心. 见我前几条回复有说明
:
: 【 在 here080 (hero080) 的大作中提到: 】
: : 这个靠的是程序逻辑来控制。
: : 你的这个A和B,就是应该使用unique_ptr和裸指针。用shared_ptr和weak_ptr属于典型的滥用。
: : 你还没说清楚为什么你这个会有dangling?如果B指向的A拥有这个B,根本就没有dangling的可能啊?
: : ...................
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 218.200.160.*]
--
FROM 76.126.252.*
还有一个问题, 如果A& 失效的话, 有没有类似断言的方法, 可以一步准确定位下来?否则后面各种崩溃, 很难检查W
【 在 ziqin (子青|会挽雕弓如满月|西北望|射天狼) 的大作中提到: 】
: 如果用A&,就根本不存在用shared_ptr还是weak_ptr的问题了吧,言下之意就是callback在B的生存期一直是有效的
--
FROM 218.200.160.*
shared_ptr不能保证100%不出问题。
而且容易产生循环引用对象无法释放这种超级难找的bug
【 在 fly2never (逆飞的鱼) 的大作中提到: 】
: 标 题: Re: 这种情况下我该不该把unique_ptr改成shared_ptr?
: 发信站: 水木社区 (Mon Jul 26 11:25:19 2021), 站内
:
: 感谢详细回答.
: 确实如你所说. 如果我能100%确认不会失效, 那么用 A& 是最好的. 这样语义明确, 不用到处判空.
:
: 但是项目大了之后, 很多人写代码, 我在想要不要 强制一个团队规范, 就是不用在成员变量里面使用 raw pointer, 如果有, 就用weak_ptr来代替. 这样就100%保证了不会出问题, 但是代价是性能会降低.
:
: 如果让大家自己判断是否会danging,而使用A&的话, 就有风险. 团队技术人员能力有高有低, 就有隐患
: 【 在 ziqin (子青|会挽雕弓如满月|西北望|射天狼) 的大作中提到: 】
: : 如果要一定保证不失效,就只有使用shared_ptr或者weak_ptr
: : 楼主的问题是不是要牺牲效率而从代码级别保证访问callback不会出问题
: : 如果callback有可能会在B的生存期内失效,那就不需要讨论,直接上weak_ptr
: : ...................
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 218.200.160.*]
--
FROM 76.126.252.*
崩溃了不就知道发生啥了?
你想定位什么?这个不是一处程序问题,是整个一大块程序共同的问题。
【 在 fly2never (逆飞的鱼) 的大作中提到: 】
: 标 题: Re: 这种情况下我该不该把unique_ptr改成shared_ptr?
: 发信站: 水木社区 (Mon Jul 26 11:31:03 2021), 站内
:
: 还有一个问题, 如果A& 失效的话, 有没有类似断言的方法, 可以一步准确定位下来?否则后面各种崩溃, 很难检查W
:
: 【 在 ziqin (子青|会挽雕弓如满月|西北望|射天狼) 的大作中提到: 】
: : 如果用A&,就根本不存在用shared_ptr还是weak_ptr的问题了吧,言下之意就是callback在B的生存期一直是有效的
:
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 218.200.160.*]
--
FROM 76.126.252.*
效率肯定是要降低的,至于降低多少,会不会影响最终程序效果,要看你这个类用在什么地方,如果是高频高密集使用,你用shared_ptr和weak_ptr肯定是会影响最终效果的。
我觉得和你这个有可比性的是,google的protobuf,里面有很多set_allocated_xxx,之类的接口,google的也没有从代码级别保证一定不会访问失效地址,只是说大家要注意。
当然,这个和程序员的价格有关系。。。
【 在 fly2never 的大作中提到: 】
: 感谢详细回答.
: 确实如你所说. 如果我能100%确认不会失效, 那么用 A& 是最好的. 这样语义明确, 不用到处判空.
: 但是项目大了之后, 很多人写代码, 我在想要不要 强制一个团队规范, 就是不用在成员变量里面使用 raw pointer, 如果有, 就用weak_ptr来代替. 这样就100%保证了不会出问题, 但是代价是性能会降低.
: ...................
--
FROM 36.23.69.*