【Boost】boost::shared_from_this值得注意的地方

本文详细解释了在C++中如何正确使用shared_from_this函数,包括其使用的限制条件及应用场景。文章通过对比正确与错误的代码示例,帮助读者理解在哪些情况下可以调用此函数以获取指向自身对象的shared_ptr。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shared_from_this()在一个类中需要传递类对象本身shared_ptr的地方使用shared_from_this函数来获得指向自身的shared_ptr,它是enable_shared_from_this的成员函数,返回shared_ptr。
首先需要注意的是:这个函数仅在shared_ptr的构造函数被调用之后才能使用。原因是enable_shared_from_this::weak_ptr并不在enable_shared_from_this构造函数中设置,而是在shared_ptr的构造函数中设置。
a) 如下代码是错误的:

[cpp] view plaincopyprint?
01.class D:public boost::enable_shared_from_this
02.{
03.public:
04. D()
05. {
06. boost::shared_ptr p=shared_from_this();
07. }
08.};

原因很简单,在D的构造函数中虽然可以保证enable_shared_from_this的构造函数已经被调用,但正如前面所说,weak_ptr还没有设置。
b) 如下代码也是错误的:

[cpp] view plaincopyprint?
01.class D:public boost::enable_shared_from_this
02.{
03.public:
04. void func()
05. {
06. boost::shared_ptr p=shared_from_this();
07. }
08.};
09.void main()
10.{
11. D d;
12. d.func();
13.}

错误原因同上。
c) 如下代码是正确的:

[cpp] view plaincopyprint?
01.void main()
02.{
03. boost::shared_ptr d(new D);
04. d->func();
05.}

这里boost::shared_ptr d(new D)实际上执行了3个动作:
1. 首先调用enable_shared_from_this的构造函数;
2. 其次调用D的构造函数;
3. 最后调用shared_ptr的构造函数。
是第3个动作设置了enable_shared_from_this的weak_ptr,而不是第1个动作。这个地方是很违背c++常理和逻辑的,必须小心。

结论是:不要在构造函数中使用shared_from_this;其次,如果要使用shared_ptr,则应该在所有地方均使用,不能使用D d这种方式,也决不要传递裸指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值