头文件:“boost/scoped_ptr.hpp”
scoped_ptr是一个类似于auto_ptr的智能指针,包装了new操作符在堆上分配动态对象,能够在保证在任何时候都能将动态分配的对象正确的删除。scoped_ptr的所有权不能移交给别的对象,并且不允许复制和赋值操作。
代码实现
template<typename T>
class ScopedPtr
{
public:
explicit ScopedPtr(T *p=0):mp(p)
{
}
~ScopedPtr()
{
delete mp;
}
void reset(T *p=0)
{
if(mp!=p)
{
delete mp;
mp=p;
}
}
T &operator*() const
{
if(mp!=0)
return *mp;
else
throw std::runtime_error("the pointer is null");
}
T *operator->() const
{
if(mp!=0)
return mp;
else
throw std::runtime_error("the pointer is null");
}
T *get() const
{
return mp;
}
void swap(ScopedPtr &rhs)
{
T *temp=mp;
mp=rhs.mp;
rhs.mp=temp;
}
private:
ScopedPtr(const ScopedPtr& rhs);
ScopedPtr &operator=(const ScopedPtr& rhs);
T *mp;
};
用法:
在开头加上
#include
<boost/scoped_ptr.hpp>和
using
boost::
scoped_ptr;
int main()
{
cout << "Hello World!" << endl;
scoped_ptr<string> sp(new string("book"));
scoped_ptr<string> sp2(new string("school"));
cout<<*sp<<endl;
cout<<sp->size()<<endl;
sp.reset(new string("the second"));
cout<<*sp<<endl;
sp.swap(sp2);
cout<<"sp's value :"<<*sp<<endl;
cout<<"sp2's value :"<<*sp2<<endl;
return 0;
}
(1)使用重载操作符“*”:
scoped_ptr<string> sp(new string("book"));
cout<<*sp<<endl;
(2)使用重载操作符“->”:
cout<<sp->size()<<endl;
(3)使用成员函数reset:
sp.reset(new string("the second"));
cout<<*sp<<endl;
(4)使用swap函数:
scoped_ptr<string> sp2(new string("school"));
sp.swap(sp2);
cout<<"sp's value :"<<*sp<<endl;
cout<<"sp2's value :"<<*sp2<<endl;
总结:
●不需要进行delete操作,因为在scoped_ptr对象超出作用域的时候,编译器会调用scoped_ptr对象的析构函数将动态分配的对象删除,将资源返回给系统。
●scoped_ptr不允许复制(拷贝)、赋值。
●scoped_ptr类重载了*和->操作符,没有重载++ 或 -- 等操作符。
与auto_ptr的区别:
根本区别在于指针的所有权。auto_ptr被设计成指针的所有权可以转移给其他对象(通过复制或赋值);但是scoped_ptr对象不能转移指针的所有权,一直独占指针的所有权(除了使用reset成员函数重置内部指针所指的对象,又或者使用swap成员函数交换指针的所指的对象);
auto_ptr的对象可以被作为副本而构造新对象,也可以赋值。但是scoped_ptr禁止复制或赋值(因为复制构造函数和赋值操作符被声明为私有的,但是没有被定义);