scoped_ptr解析和总结

头文件:“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禁止复制或赋值(因为复制构造函数和赋值操作符被声明为私有的,但是没有被定义);


































  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值