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 <boost\smart_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 <boost\smart_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 <boost\smart_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类似,这里不做详细介绍。
作者:裸奔的小鸟
出处: http://www.cnblogs.com/streakingBird/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。