- 主题:这种情况下我该不该把unique_ptr改成shared_ptr?
Class A 持有 Class B
class A {
public:
std::unique_ptr B m_b;
};
Class B持有一个A的回调, 原来是用裸指针
Class B {
public:
A *callback_A;
};
原来一直这么用的,后来看的cpp guidelines,不建议用owning裸指针, 于是乎想把A * 改成weak_ptr, 但是这样的话 就需要把A 改成继承std::enable_shared_from_this, 而且以后还需要把所有 std::unique_ptr<A> 改成std::shared_ptr<A>, 这样改是否合适? 看看大家的意见
--
FROM 117.139.193.*
提示:owning裸指针的定义
【 在 fly2never (逆飞的鱼) 的大作中提到: 】
: 标 题: 这种情况下我该不该把unique_ptr改成shared_ptr?
: 发信站: 水木社区 (Sun Jul 25 23:31:06 2021), 站内
:
: Class A 持有 Class B
: class A {
: public:
: std::unique_ptr B m_b;
: };
:
: Class B持有一个A的回调, 原来是用裸指针
: Class B {
: public:
: A *callback_A;
: };
:
: 原来一直这么用的,后来看的cpp guidelines,不建议用owning裸指针, 于是乎想把A * 改成weak_ptr, 但是这样的话 就需要把A 改成继承std::enable_shared_from_this, 而且以后还需要把所有 std::unique_ptr<A> 改成std::shared_ptr<A>, 这样改是否合适? 看看大家的意见
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 117.139.193.*]
--
FROM 76.126.252.*
是的, 严格来说这个不是owning pointer.
某些情况下 A*, 可能存在A* dangling pointer 的问题, 只有weak_ptr不会dangling
比较纠结这一点
【 在 here080 (hero080) 的大作中提到: 】
: 提示:owning裸指针的定义
--
FROM 218.200.160.*
就用裸指针。
尤其是如果你这个B里指向的A对象拥有这个B对象,那根本不会有任何风险。
【 在 fly2never (逆飞的鱼) 的大作中提到: 】
: 标 题: Re: 这种情况下我该不该把unique_ptr改成shared_ptr?
: 发信站: 水木社区 (Mon Jul 26 09:49:40 2021), 站内
:
: 是的, 严格来说这个不是owning pointer.
: 某些情况下 A*, 可能存在A* dangling pointer 的问题, 只有weak_ptr不会dangling
:
: 比较纠结这一点
: 【 在 here080 (hero080) 的大作中提到: 】
: : 提示:owning裸指针的定义
:
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 218.200.160.*]
--
FROM 76.126.252.*
我觉得你这个类的设计有问题
A有个一个m_b,用unique_ptr表示独有,那m_b里的callback也只能是原来的那个object,那为什么要用A*呢?用A&不是更安全
【 在 fly2never 的大作中提到: 】
: Class A 持有 Class B
: class A {
: public:
: ...................
--
FROM 36.23.69.*
A*还是A&跟楼主讨论的问题完全无关。
【 在 ziqin (子青|会挽雕弓如满月|西北望|射天狼) 的大作中提到: 】
: 标 题: Re: 这种情况下我该不该把unique_ptr改成shared_ptr?
: 发信站: 水木社区 (Mon Jul 26 10:21:16 2021), 站内
:
: 我觉得你这个类的设计有问题
:
: A有个一个m_b,用unique_ptr表示独有,那m_b里的callback也只能是原来的那个object,那为什么要用A*呢?用A&不是更安全
:
:
: 【 在 fly2never 的大作中提到: 】
: : Class A 持有 Class B
: : class A {
: : public:
: : ...................
:
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 36.23.69.*]
--
FROM 76.126.252.*
如果用A&,就根本不存在用shared_ptr还是weak_ptr的问题了吧,言下之意就是callback在B的生存期一直是有效的
【 在 here080 的大作中提到: 】
: A*还是A&跟楼主讨论的问题完全无关。
:
--
FROM 36.23.69.*
A&只是一个必须初始化且无法重定向的A*而已
A&引用的东西跟指针指向的一样,是否失效不是语言本身保证的。
【 在 ziqin (子青|会挽雕弓如满月|西北望|射天狼) 的大作中提到: 】
: 标 题: Re: 这种情况下我该不该把unique_ptr改成shared_ptr?
: 发信站: 水木社区 (Mon Jul 26 10:29:26 2021), 站内
:
: 如果用A&,就根本不存在用shared_ptr还是weak_ptr的问题了吧,言下之意就是callback在B的生存期一直是有效的
:
: 【 在 here080 的大作中提到: 】
: : A*还是A&跟楼主讨论的问题完全无关。
: :
:
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 36.23.69.*]
--
FROM 76.126.252.*
如果要一定保证不失效,就只有使用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&引用的东西跟指针指向的一样,是否失效不是语言本身保证的。
:
--
FROM 36.23.69.*
如果不是这种情况呢,A*确实会dangling的时候, 是不是用weak_ptr是最佳实践,还是说, 设置一个set nullptr的接口,主动置空比较好?
【 在 here080 (hero080) 的大作中提到: 】
: 就用裸指针。
: 尤其是如果你这个B里指向的A对象拥有这个B对象,那根本不会有任何风险。
--
FROM 218.200.160.*