boost.smart_ptr库提供了六种智能指针:scoped_ptr、scoped_array、shared_ptr、shared_array、week_ptr和intrusive_ptr。 说到智能指针,我们会想到c++98标准中的自动指针auto_ptr. auto_ptr获取指针所有权后,离开作用域时自动释放该指针指向的堆内存。也可以转移指针的所有权。auto_ptr<A> ap_a1(new A); auto_ptr<A> ap_a2(ap_a1); //发生所有权转移,此时ap_a1不再管理申请的A对象 if (ap_a1.get() == nullptr) cout << "ap_a1.get() == nullptr" << endl; //输出ap_a1.get() == nullptr if (ap_a2.get() == nullptr) cout << "ap_a2.get() == nullptr" << endl;scoped_ptr是一个很类似auto_ptr的智能指针。但scoped_ptr的所有权不能转让。
scoped_ptr把拷贝构造函数和赋值操作符声明为私有,重载了*和->操作符,因此可以把scoped_ptr当作指针一样使用。
需要包含<boost/scoped_ptr.hpp>头文件,引用boost命名空间
void func() { scoped_ptr<A> sp_a1(new A); sp_a1->print(); //支持普通指针的*、->操作符 sp_a1.get()->print(); //成员函数get返回持有的指针 sp_a1.reset(new A); //reset不再持有之前的指针,删除指针,并持有新指针,会调用A类的析构函数 sp_a1++; //错误,未定义递增操作符 scoped_ptr<A> sp_a2(sp_a1); //错误,不支持指针所有权转移 }不需要delete操作,scoped_ptr会自动帮我们释放资源,所以如果在之前对指针delete,scoped_ptr析构时再对指针delete可能会发生未定义行为。
scoped_ptr不会向auto_ptr一样转移指针所有权,会减少错误的发生,没有多余的操作,保证了与原始指针同样的效率,代码也更清晰。
scoped_array
scoped_array类似scoped_ptr,接口和功能几乎是与scoped_ptr相同,弥补了标准库中没有指向数组的智能指针的缺憾。
速度与原始数组几乎一样快,但不支持动态增长数组。不支持迭代器,不能搭配STL算法。
注意:
1.scoped_array接受的指针必须是new[]的结果,不能是new表达式的结果
2.scoped_array没有重载*、 ->操作符
3.重载了[]操作符,可以向普通数组用下标访问。
scoped_array<int> sa(new int[100]); //包装动态数组 sa[0] = 10; //正确,重载了[] *(sa + 1) = 20; //错误, 没有重载* { scoped_array<int> sa(new int[100]); } //退出作用域自动释放数组资源
时间: 2024-10-21 23:43:54