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            //正常析构

  • 相关阅读:
    SecureCRT的设置和美化
    strtod-strtod, 字符串 转 数字 函数
    Debug : array type has incomplete element type
    Linux上Core Dump文件的形成和分析
    centos7,进程最大打开文件数 too many open files错误
    不使用临时变量交换两个值
    C语言的设计理念
    K&R C vs ANSI C(数据类型提升)
    再也不怕C语言的声明了
    K&R C vs ANSI C(数据类型转换)
  • 原文地址:https://www.cnblogs.com/pangblog/p/3395454.html
Copyright © 2011-2022 走看看