zoukankan      html  css  js  c++  java
  • 多个非同源的shared_ptr管理对象引起double free

       有多个不同源的shared_ptr管理对象时会出现多次释放对象,这里不同源是指多组间不是通过拷贝构造、复制等手段而来的,即几组shared_ptr是独立声明的。

    #include<iostream>
    #include<pthread.h>
    #include<unistd.h>
    #include<boost/enable_shared_from_this.hpp>
    #include<boost/shared_ptr.hpp>
    using namespace std;
    using namespace boost;
    class test{
        public:
            void show(){
                shared_ptr<test> one(this);//###1###带此符号的两处shared_ptr非同源会造成:这里的shared_ptr退出作用后就将管理的对象进行析构,而外层的shared_ptr对此全然不知,继续使用该对象,麻烦就来了...
                cout<<"show()"<<endl;
            }
            ~test(){
                cout<<"~test"<<endl;
            }
    };
    int main(){
        shared_ptr<test> one(new test);//###1###
        one->show();
        shared_ptr<test> two=one;//拷贝一个shared_ptr
        two->show();
        return 0;
    }


    程序输出:

    show()
    ~test
    show()
    ~test                   //同一对象析构了两次
    *** glibc detected *** ./two_shared_ptr_1: double free or corruption (fasttop): 0x000000000080b010 ***         //double free

    采用继承enable_shared_from_this,然后使用shared_from_this()可以解决这个问题

    #include<iostream>
    #include<pthread.h>
    #include<unistd.h>
    #include<boost/enable_shared_from_this.hpp>
    #include<boost/shared_ptr.hpp>
    using namespace std;
    using namespace boost;
    class test:public enable_shared_from_this<test> {//继承
        public:
            void show(){
                shared_ptr<test> one(shared_from_this());//采用shared_from_this()的shared_ptr是同源的
                cout<<"show()"<<endl;
            }
            ~test(){
                cout<<"~test"<<endl;
            }
    };
    int main(){
        shared_ptr<test> one(new test);
        one->show();
        shared_ptr<test> two=one;
        two->show();
        return 0;
    }



    程序输出:

    show()
    show()
    ~test            //正常析构

  • 相关阅读:
    大数据学习——hive数据类型
    大数据学习——关于hive中的各种join
    大数据学习——hive的sql练习
    大数据学习——hive显示命令
    大数据学习——hive数仓DML和DDL操作
    大数据学习——hive基本操作
    大数据学习——hive使用
    大数据学习——hive安装部署
    大数据学习——日志分析
    大数据学习——mapreduce运营商日志增强
  • 原文地址:https://www.cnblogs.com/pangblog/p/3395454.html
Copyright © 2011-2022 走看看