头文件:
1. scoped_ptr & scoped_array
只能在本作用域内使用,不希望被转让; 效率等同原始指针;
scoped_ptr<string> sp(new string("test"));
cout << *sp << endl;
cout << sp->size() << endl;
// scoped_array
scoped_array<int> sa(new int[100]);
fill_n(&sa[0],100,10);//使用标准库算法填充数组;
sa[10] = sa[20] + sa[30];
cout << sa[10] << endl;
2. shared_ptr
引用计数,自由拷贝,赋值; 引用计数为0时才删除被包装的动态分配的对象;
线程安全;
boost::shared_ptr<int> sp1(new int(10));
assert(sp1.unique());
boost::shared_ptr<int> spp1 = sp1;
cout << sp1.use_count() << endl;//2
//make_shared()最多接收10个参数,比直接创建shared_ptr对象快且高效;仅分配了一次内存,消除了shared_ptr构造时的开销;
//#include <boost/make_shared.hpp>
boost::shared_ptr<string> sp2 = boost::make_shared<string>("make shared");
boost::shared_ptr<vector<int> > spv = boost::make_shared<vector<int> >(10,2);
cout << *sp2 << " " << spv->size() << endl;//make shared 10
// shared_ptr应用于标准容器; auto_ptr和scoped_ptr不能用于;
typedef vector<boost::shared_ptr<int> > vs;
vs s(10);
int i = 0;
for(vs::iterator iter = s.begin(); iter != s.end(); ++iter){
(*iter) = boost::make_shared<int>(++i); //使用工厂函数赋值
//cout << *(*iter) << endl; //打印
}
boost::shared_ptr<int> p = s[7];
*p = 100; //修改s[7]值;
cout << *s[7] << endl; //100
//应用于桥接模式
...
//应用于工厂模式
...
//定制删除器;
//boost::shared_ptr<FILE> fp(fopen("./test.txt","r"), fclose); //离开作用域时,自动调用fclose删除器删除fp;打开失败会段错误!!!
由于 shared_ptr在boost和std命名空间都存在,所以调用时需要指定对应的命名空间前缀,如boost:: ;
3. weak_ptr
协助shared_ptr工作,像旁观者一样观测资源的使用情况;
可以从一个shared_ptr或weak_ptr对象构造,但不会共享资源,构造和析构不会引起技术增减;
boost::shared_ptr<int> spp(new int(10));
assert(spp.use_count() == 1);
boost::weak_ptr<int> wp(spp);
assert(wp.use_count() == 1);
//判断weak_ptr观测的对象是否失效; 等效use_count==0;
if(!wp.expired())
{
boost::shared_ptr<int> sp2 = wp.lock();//返回一个shared_ptr;
*sp2 = 100;
assert(wp.use_count() == 2);
}
assert(wp.use_count() == 1);