`
vyloy
  • 浏览: 80715 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

boost::enable_shared_from_this分析

    博客分类:
  • C++
阅读更多
为什么需要boost::enable_shared_from_this?

class cat{};

shared_ptr<cat> p(new cat);
shared_ptr<cat> p2(p);



class cat:public boost::enable_shared_frome_this{};

shared_ptr<cat> p(new cat);
shared_ptr<cat> p2=p->shared_from_this();


这两段代码看似没什么区别。但是如果你在程序里,比如在cat中的成员方法中,有的只是cat的raw pointer,但你依然想利用shared_ptr的自动delete特性,又不想自己防止由于存在多个shared_ptr<cat>对同一个cat对象delete多次的危险。即多个shared_ptr<cat>共用同一个计数器。这时候,boost::enable_shared_frome_this就变得很方便了。

struct A;

void f(shared_ptr<A> const&) {...}

struct A: public enable_shared_from_this<A>
{
    void a_f()
    {
        // you need to call f() here passing itself as a parameter
        f(shared_from_this());
    }
};

shared_ptr<A> a_ptr(new A());
a_ptr->a_f(); // in inner call to f() will be used temporary shared_ptr<A> 
// that uses (shares) the same reference counter as a_ptr 


boost::enable_shared_from_this原理

其实继承了boost::enable_shared_from_this的类,真正的magic是发生在创建它的第一个shared_ptr实例时。shared_ptr会反调boost::enable_shared_from_this的_internal_accept_owner方法。
template<class T> class enable_shared_from_this
{
protected:

    enable_shared_from_this()
    {
    }

    enable_shared_from_this(enable_shared_from_this const &)
    {
    }

    enable_shared_from_this & operator=(enable_shared_from_this const &)
    {
        return *this;
    }

    ~enable_shared_from_this()
    {
    }

public:

    shared_ptr<T> shared_from_this()
    {
        shared_ptr<T> p( weak_this_ );
        BOOST_ASSERT( p.get() == this );
        return p;
    }

    shared_ptr<T const> shared_from_this() const
    {
        shared_ptr<T const> p( weak_this_ );
        BOOST_ASSERT( p.get() == this );
        return p;
    }

public: // actually private, but avoids compiler template friendship issues

    // Note: invoked automatically by shared_ptr; do not call
    template<class X, class Y> void _internal_accept_owner( shared_ptr<X> const * ppx, Y * py ) const
    {
        if( weak_this_.expired() )
        {
            weak_this_ = shared_ptr<T>( *ppx, py );
        }
    }

private:

    mutable weak_ptr<T> weak_this_;
};

//从源码中,可以看出,重点不在于初始化的时候。而是在于创建第一个该对象的shared_ptr的时候:

template<class Y>
explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete
{
    boost::detail::sp_enable_shared_from_this( this, p, p );
}

template< class X, class Y, class T > inline void sp_enable_shared_from_this( boost::shared_ptr<X> const * ppx, Y const * py, boost::enable_shared_from_this< T > const * pe )
{
    if( pe != 0 )
    {
        pe->_internal_accept_owner( ppx, const_cast< Y* >( py ) );
    }
}


作者:翁志艺
分享到:
评论

相关推荐

    boost::asio::serialport实现串口通信

    Boost库是C++的一个强大工具集,它提供了`boost::asio`模块,用于处理网络和底层I/O操作,包括串口通信。本篇文章将详细介绍如何使用`boost::asio::serialport`来实现串口通信。 首先,我们需要理解`boost::asio`的...

    shared_from_this() in Constructor:直接替换std :: shared_ptr + std :: enable_shared_from_this-开源

    显然,许多人不喜欢标准std :: enable_shared_from_this类不允许在构造函数中调用shared_from_this()。 猜猜是什么:应该填补这个空白。 boost库也可以这样做,但是它不允许在析构函数中创建shared_ptrs,并且它不...

    boost::lexical_cast用法

    boost::lexical_cast用法示例,包含数值转字串,字串转数值以及相应的异常处理代码

    C++11 下使用 Boost.Serialization 库实现智能指针的序列化

    然而,`std::unique_ptr`不支持拷贝构造函数和赋值操作符,所以我们需要使用`boost::serialization::make_nvp`创建一个命名值对,并在`archive`对象上调用`save_object`或`save_pointer`方法。 接下来是`std::...

    orthanc ThirdPartyDownloads:boost_1_69_0_bcpdigest-1.5.6.tar.gz

    标题中的"orthanc ThirdPartyDownloads:boost_1_69_0_bcpdigest-1.5.6.tar.gz"指的是Orthanc项目的第三方依赖下载,其中包含的是Boost库的一个特定版本,即1.69.0,以及一个名为bcpdigest的工具,版本为1.5.6。...

    浅析Boost智能指针:scoped_ptr shared_ptr weak_ptr

    `boost::shared_ptr` 是一个可共享所有权的智能指针,多个`boost::shared_ptr`可以共享同一个对象,当最后一个`boost::shared_ptr`析构时,对象也会被销毁。这通常用于需要多线程环境下的资源管理。 #### 特点: 1....

    boost_1_78_0编译及使用

    3. **示例代码**: 使用Boost库的一个简单例子,如使用`boost::thread`创建线程: ```cpp #include &lt;boost/thread/thread.hpp&gt; void hello() { std::cout , World from a thread!" &lt;&lt; std::endl; } int main...

    boost graph library

    boost::dijkstra_shortest_paths(g, s, boost::distance_map(boost::make_iterator_property_map(dist.begin(), boost::get(boost::vertex_index, g)))); return 0; } ``` ### 总结 Boost Graph Library是一个...

    改进 boost::object_pool 内存池效率问题。

    相信不少人听过 boost 委员会提过 boost 里的对象池设计存在缺陷。我花了一些时间研究它的实现,发现其在效率上确实存在严重问题。这里给出一套解决方案。在效率上有了较大提高。可以完全替换你项目里的 object_pool...

    boost库1.68版本windows下编译的dll和lib库

    Boost库是C++编程语言的一个开源库集合,包含了大量的实用工具和库,旨在提升C++的标准库功能。在本案例中,我们关注的是Boost库的1.68版本,该版本已在Windows环境下使用Visual Studio 2017进行编译,并生成了用于...

    xcode iOS 使用 boost::asio 的 demo

    UDP通信中,`boost::asio::async_send_to`和`boost::asio::async_receive_from`用于异步发送和接收数据到特定的远程地址。 在处理异步操作时,通常会使用回调函数或lambda表达式。当一个异步操作完成时,Boost.Asio...

    boost线程库源码,程序员自用

    3. **线程睡眠与唤醒**:`boost::this_thread::sleep`函数可以让当前线程进入休眠状态,直到指定的时间过去或者被其他线程唤醒。`boost::condition_variable`则用于线程间的同步等待和唤醒。 4. **线程组**:`boost...

    boost_1_59_0.tar.gz

    This CMake script will look for boost in &lt;directory&gt;. If it is not there, it will download and unpack it (in that directory) for you. If you are inside a firewall, you may need to use an ...

    boost_1_59_0.tar

    boost_1_59_0.tar.zip boost_1_59_0.tar.zip boost_1_59_0.tar.zip boost_1_59_0.tar.zip boost_1_59_0.tar.zip boost_1_59_0.tar.zip boost_1_59_0.tar.zip boost_1_59_0.tar.zip boost_1_59_0.tar.zip boost_1_59_...

    boost_1_44_0

    5. **正则表达式库**:`boost::regex`提供了强大的正则表达式支持,比C++标准库中的实现更为强大和灵活。 6. **并发与线程**:`thread`库提供了线程管理和同步原语,如互斥量、条件变量和future/promise,帮助...

    boost_1_53_0.tar.gz

    其次,Boost库中的智能指针(如boost::shared_ptr和boost::unique_ptr)在C++11标准中被采纳,成为std::shared_ptr和std::unique_ptr。这些智能指针管理对象生命周期,避免内存泄漏,提高了代码的安全性。在boost_1_...

    boost_1_61_0

    3、在工程中设置工程属性来使用boost库 工程属性----------C/C++----------附加包含目录:D:\boost_1_61_0(此处就是你的安装目录)添加进去 工程属性----------链接器----------附加库目录:D:\boost_1_61_0\stage\...

    boost_pi_control_loop_design.rar_boost mathcad_boost pi_boost闭环

    用户可以通过这个文件深入理解Boost PI闭环控制的设计方法,包括数学模型建立、控制器参数计算、稳定性分析和性能指标评估等。通过实际操作,学习者可以直观地看到不同参数对系统性能的影响,从而加深对电力系统控制...

Global site tag (gtag.js) - Google Analytics