• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    4年前 (2014-04-16)  C++ 评论关闭  18 
    文章评分 0 次,平均分 0.0

    shared_ptr<>是在堆中对象的wraper。有时候,由于历史原因或者库接口原因,不支持智能指针参数,我们需要从shard_ptr中提取出原始指针,但是原始指针就会增加不安全因素,因为说不定就在某个函数内被delete,然而其他地方仍旧使用该内存区,导致内存泄露。

    #include &lt;boost/shared_ptr.hpp&gt;
    #include &lt;iostream&gt;
    
    class A
    {
    private:
            class deleter
            {
            public:
                    void operator()(A* p)
                    {
                            std::cout&lt;&lt;"delete A"&lt;&lt;std::endl;
                            delete p;
                    }
            };
    public:
            static boost::shared_ptr&lt;A&gt; creatA()
            {
                    boost::shared_ptr&lt;A&gt; p1(new A(),A::deleter());
                    return p1;
            }
    protected:
             virtual ~A(){std::cout&lt;&lt;"析构 A"&lt;&lt;std::endl;}
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
            {
                    boost::shared_ptr&lt;A&gt; p = A::creatA();
    #if 0
                    A* a = p.get();
                    delete a;
    #endif 
    #if 0
                    A* a = new A();
                    delete a;
    #endif
            }
            system("pause");;
            return 0;
    }

    在上面中,让析构函数为保护(protected)权限,这样可以有效避免直接析构原始指针。为了能够有效清理对象,需要定义一个删除器仿函数,如代码中的deleter.

                    A* a = p.get();
                    delete a;

    当使用智能指针获取原始指针并delete时,将会出错。

                    A* a = new A();
                    delete a;

    甚至,你不能在栈上定义A的对象,更不能delete A的原始指针。

    这当然对shared_ptr使用来说,更安全。但是意味着使用也更受限。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/3300.html

    关于
    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享