zoukankan      html  css  js  c++  java
  • c++ boost库学习二:内存管理->智能指针

    写过C++的人都知道申请和释放内存组合new/delete,但同时很多人也会在写程序的时候忘记释放内存导致内存泄漏。如下所示:

    int _tmain(int argc, _TCHAR* argv[])
    {    
        char *p = new char[10];
        try{
            strcpy(p,"hello");
        }
        catch(int &e)
        {
            //....
            return 1;
        }
        delete p;
        return 0;
    }

    如果程序发生error而异常退出不会执行到最后的delete p,从而导致内存泄漏。于是程序员必须在所有分支都加上delete语句释放内存,这样太麻烦而且容易出错。

    所以智能指针的出现很好的解决了这个问题。c++98标准里有一个std::auto_ptr,但下面介绍的是另外的智能指针scoped_ptr(我反正就当它跟auto_ptr是一样的)以及比较推荐使用的shared_ptr。

    scoped_ptr

    #include "iostream"
    #include <string>
    #include <boostsmart_ptr.hpp>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {    
        boost::scoped_ptr<string> p(new string("hello"));
        cout<<*p<<endl;  //hello
        cout<<p->size()<<endl;  //5
        
        boost::scoped_ptr<string> p2 =p;  //error
        p++;  //error 
    
        return 0;
    }

    scoped_ptr只有*和->操作符,它退出作用域之后会自动释放内存,所以不需要delete。

    scoped_ptr不允许拷贝和赋值。与普通指针相比它只有很少的接口,所以它更安全。

    通过  T* get() const; 函数可以返回普通指针,比如上面代码可以通过  string *s=p.get(); 返回string*

    scoped_array

    从名字就可以看出来scoped_array就是一个scoped_ptr的数组。如果说scoped_ptr可以看作是自动执行new/delete操作的话,那scoped_array可以看作是自动执行

    new[]/delete[]操作。但由于scoped_array功能有限以及不安全,所以不推荐使用

    #include "iostream"
    #include <string>
    #include <boostsmart_ptr.hpp>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {    
        boost::scoped_array<int> sa(new int[100]);
        for(int i=0;i<100;i++)
            sa[i]=i;
        cout<<sa[10]<<endl;
        return 0;
    }

    shared_ptr

    shared_ptr是最好的,最推荐使用的,原因如下:

    shared_ptr 除了*和->以外还支持比较运算 ==,<

    shared_ptr是基于引用计数型的智能指针,可以被赋值和拷贝

    shared_ptr能被安全的放在标准容器中

    #include "iostream"
    #include <vector>
    #include <string>
    #include <map>
    #include <boostsmart_ptr.hpp>
    using namespace std;
    
    typedef boost::shared_ptr<string> sp_ptr;
    int _tmain(int argc, _TCHAR* argv[])
    {    
        sp_ptr sp(new string("hello"));
        sp_ptr sp2=sp;
        assert(sp==sp2);
    
        // 在标准容器中使用
        vector<sp_ptr> v;
        v.push_back(sp);
        v.push_back(sp2);
        cout<<v.size()<<endl; //2
        map<sp_ptr,int> m;
        sp_ptr sp3(new string("hello"));
        m[sp3] = 110;
        return 0;
    }

    有shared_ptr 同样也会有shared_array。基本跟scoped_ptr和scoped_array类似,这里不做详细介绍。

  • 相关阅读:
    C# 设计模式-抽象工厂模式
    C# 设计模式-工厂方法模式
    C# 设计模式-简单工厂模式
    C# 设计原则-迪米特法则(最少知识原则)
    C# 设计原则-接口隔离原则
    阻止右击事件并更改为自定义导航栏;
    今日头条滚动新闻版块特效
    抓包工具
    查看页面加载速度
    插件那点事
  • 原文地址:https://www.cnblogs.com/streakingBird/p/3843672.html
Copyright © 2011-2022 走看看