scoped_ptr是一个类似auto_ptr的智能指针,scoped_ptr可以保证new操作符在堆上创建的对象在任何时候都可以被正确的删除。
scoped_ptr的最大特点就是一旦scoped_ptr拥有了某个对象的所有权,就无法再次取回!
scoped_ptr的构造函数:
scoped_ptr(T *p=0):px(p)
{
}
//其接受T*类型的指针p,创建出对象,并在该对象内部保存指针参数p,此处p必须是一个new动态分配的结果,或者是一个空指针
scoped_ptr的析构函数:
~scoped_ptr()
{
delete px;
}
//对象的生命周期结束后,析构函数调用delete自动销毁所保存的对象
scoped_ptr为了保证被其管理的指针的所有权不被转移,就将其拷贝构造和赋值函数设置为私有的:
private:
T *px;
scoped_ptr(scoped_ptr cosnt &);
scoped_ptr& operator=(scoped_ptr const &);
scoped_ptr的成员函数reset():重置scoped_ptr,删除原来保存的指针,再保存新的指针,若新指针为空,则scoped_ptr将不持有任何指针:
void reset(T *p = 0)
{
T(p).swap(*this);
}
void swap(scoped_ptr &b) //交换两个scoped_ptr保存的指针
{
_T *tmp = b.px;
b.px = px;
px = tmp;
}
scoped_ptr不支持比较操作,不能判断两个指针的相等或不相等,因为其operator== 和 operator!= 操作被声明为私有的:
private:
void operator==(scoped_ptr const &)const;
void operator!=(scoped_ptr const &)const;
scoped_ptr的成员函数get():得到scoped_ptr内部保存的指针,不可对该指针进行delete操作,否则会在scoped_ptr析构时会对已经删除的指针再进行删除操作:
T *get()const
{
return px;
}
注意:
scoped_ptr不再需要delete操作scoped_ptr会自动释放资源
以下是我对scoped_ptr的测试:
#include<iostream>
#include<memory>
#include<boost/smart_ptr.hpp>
using namespace std;
using namespace boost;
//scoped_ptr不需要delete操作,因其会自动释放资源
//scoped_ptr不能进行拷贝构造,所以不能执行scoped_ptr<int> ps = p;(错误)
int main()
{
scoped_ptr<int> p1;
int *p = new int(10);
scoped_ptr<int> ps(p);
cout<<*ps<<endl;
cout<<*p<<endl;
*ps = 20;
cout<<*ps<<endl;
//p1 = ps; //scoped_ptr不支持赋值和拷贝构造,因为其是私有操作
int *q = new int(30);
ps.reset(q); //重置
cout<<*ps<<endl;
int *m = new int(40);
auto_ptr<int> ps1(m);
scoped_ptr<int> ps2(ps1);
cout<<*ps2<<endl;
//cout<<*ps1<<endl; //其拥有权已被转移至scoped_ptr的ps2,该指针已经指向空
ps1.reset(new int(50));
cout<<*ps1<<endl;
return 0;
}
深入理解智能指针scoped_ptr
本文详细介绍了 scoped_ptr,一种确保对象在适当时候正确删除的智能指针。它不允许所有权转移,拥有对象后不能通过拷贝或赋值操作改变。scoped_ptr 提供了 reset() 函数用于替换指针,并且不支持指针比较操作。get() 方法可获取指针,但不应直接删除,以防止析构时重复删除。 scoped_ptr 在不需要手动删除的情况下确保资源自动释放。
5000

被折叠的 条评论
为什么被折叠?



