读书人

[Boost基础]智能指针(2)

发布时间: 2013-03-06 16:20:31 作者: rapoo

[Boost基础]智能指针(二)

#include <iostream>#include <string>#include <conio.h>    //1.作用域指针//它独占一个动态分配的对象,对应的类名为boost::scoped_ptr,定义在boost/scoped_ptr.hpp中。不像std::auto_ptr,作用域指针不能传递它所包含的对象的所有权到另一个作用域指针。一旦用一个地址来初始化,这个动态分配的对象将在析构阶段释放。因为一个作用域指针只是简单保存和独占一个内存地址,所以boost::scoped_ptr的实现就要比std::auto_ptr简单。在不需要所有权传递的时候应该优先使用boost::scoped_ptr.在这些情况下,比起std::auto_ptr它是一个更好的选择,因为可以避免不经意间的所有权传递。因此我们通常可以用它来实现局部动态对象的自动释放,比如在函数调用中产生的动态对象。#include <boost/scoped_ptr.hpp>void test1(){boost::scoped_ptr<int> p(new int);*p=1;    *p.get()=2;p.reset(new int);}//2.作用域数组//作用域数组的使用方式与作用域指针相似。关键不同在于,作用域数组的析构函数使用delete[]操作符来释放所包含的对象。因为该操作符只能用于数组对象,所以作用域数组必须通过动态分配数组来初始化。对应的作用域数组类名为boost::scoped_array,它的定义在boost/scoped_array.hpp里。#include <boost/scoped_array.hpp>void test2(){boost::scoped_array<int> ap(new int[2]);*ap.get()=1;ap[1]=2;ap.reset(new int[3]);}//3.共享指针//这个智能指针命名为boost::shared_ptr,定义子啊boost/shared_ptr.hpp里。智能指针boost::shared_ptr基本上类似于boost_scoped_ptr.关键不同之处在于boost::shared_ptr类型的智能指针共享所有权。子啊这种情况下,当引用对象的最后一个智能指针销毁后,对象才会释放。因为所有权可以在boost::shared_ptr之间共享,任何一个共享指针都可以被复制,这跟boost::scoped_ptr是不同的。这样就可以在标准容器里存储智能指针了——你不能再标准容器中存储std::suto_ptr,因为他们在拷贝的时候传递了所有权。#include <vector>#include <algorithm>#include <boost/shared_ptr.hpp>void myprint(boost::shared_ptr<int> i){printf("%d\n",*i);}void test3(){std::vector<boost::shared_ptr<int>>v;boost::shared_ptr<int> s1(new int(1));boost::shared_ptr<int> s2(new int(2));v.push_back(s1);v.push_back(s2);std::for_each(v.begin(),v.end(),myprint);//输出 1 2}#include <stdio.h>#include <stdlib.h>class Test{public:Test(int i):_i(i){printf("test construct:%d\n",_i);}~Test(){printf("~test destroyed:%d\n",_i);}void myprint(){printf("test value:%d\n",_i);}private:int _i;};void test4(){boost::shared_ptr<Test> te1(new Test(1));//test construct:1boost::shared_ptr<Test> te2(te1);boost::shared_ptr<Test> te3(te1);te1.reset(new Test(2));//test construct:2te1->myprint();//test value:2te2->myprint();//test value:1te3->myprint();//test value:1//最后输出//~test destroyed:1//~test destroyed:2} //4.共享数组//共享数组的行为类似于共享指针。关键不同在于共享数组在析构是,默认使用的是delete[]操作符来释放所包含对象。因为这个操作符只能用于数组对象,共享数组必须通过动态分配的数组地址来初始化。共享数组对应的类型是boost::shared_array,它的定义在boost/shared_arrary.hpp里。#include <boost/shared_array.hpp>void test5(){ boost::shared_array<int> sa1(new int[2]);boost::shared_array<int> sa2(sa1);sa1[0]=1;std::cout<<sa2[0]<<"  "<<sa2[1]<<std::endl;//1 -84150451} //对智能指针的良好运用可以有效处理内存,资源等自我管理释放问题。对于现代C++来说,是必不可少的一件"神器"。同时在boost库里面也有广泛应用,如在asio中,shared_ptr的使用就是其中一例。void test(char t){std::cout<<"press key====="<<t<<std::endl;switch (t){  case '1':test1();break; case '2':test2();break; case '3':test3();break; case '4':test4();break; case '5':test5();break; case 27:case 'q':exit(0);break;default: std::cout<<"default "<<t<<std::endl;break;}}int main(){while(1){test(getch());} return 0;}

读书人网 >操作系统

热点推荐