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类似,这里不做详细介绍。

原文地址:https://www.cnblogs.com/streakingBird/p/3843672.html