C++的智能指针

C和C++中都容许使用指针,使用指针就有一个致命的肯定,那就是内存释放的问题,习惯了java写法程序员,不适应指针那是固然,对内存的释放也是云里雾里。为了减小程序开发的困扰,在C++中引入了智能指针的功能,所谓智能指针即程序员能够不用关心内存的释放问题,程序会根据当前的引用状况自动释放内存。java

在C++中智能指针包括四种类型:auto_ptr, shared_ptr, weak_ptr, unique_ptr程序员

auto_ptr是C++98中实现的,而其余后三种是在C++11中实现的。指针

 

auto_ptr的使用内存

auto_ptr<string> ps = auto_ptr<string>(new string("test"));开发

此时new出来的string不须要主动释放,当使用完成以后智能指针会主动释放。string

那auto_ptr有什么缺陷呢?编译

看下面的例子:test

string str = new string("hello");变量

auto_ptr<string> ps1 = auto_ptr<string>(str);引用

auto_ptr<string> ps2 = auto_ptr<string>(str);

按照上面的说法智能指针会主动释放指针,那这样的话str这个变量不是会被释放两次吗,这样就会出现一个重复释放的问题,为了解决这个问题就引入shared_ptr和unique_ptr

 

unique_ptr的使用

unique_ptr会把可能的错误暴露在编译时,那么上面这段代码改为下面的代码就会出现错误:

 

string str = new string("hello");

unique_ptr<string> ps1 = unique_ptr<string>(str);

unique_ptr<string> ps2 = unique_ptr<string>(str);

 

unique_ptr只容许一个智能指针指向这段内存,那若是我须要多个指向怎么办呢?这个时候能够使用shared_ptr

 

share_ptr的使用

string str = new string("hello");

shared_ptr<string> ps1 = shared_ptr<string>(str);

shared_ptr<string> ps2 = ps1;

这样是能够的,shared_ptr采用计数的方式,当进行一次赋值则引用计数加1,当释放的使用引用计数减1.

相关文章
相关标签/搜索