温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解Boost库中的scoped_ptr

发布时间:2021-11-25 15:28:30 来源:亿速云 阅读:121 作者:柒染 栏目:编程语言

这篇文章将为大家详细讲解有关如何理解Boost库中的scoped_ptr,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1、VC和VS

  VC版并不是标准C++,VS版符合标准C++,其语法相当严格。

  缺点:VC和VS都只能释放一个具体类型空间,不能对数组空间进行释放,还有写时拷贝的问题;

  所以引发了Boost库的出现来解决此类问题。

2、Boost库

  推荐看一下Boost库完全开发指南。

  Boost本身是开源库,在C++中的地位举足轻重,第三章内存管理,智能指针;

  C++中也提供了智能指针,但是并不能解决所有问题。

  smart_ptr库中:new delete的运用不正确,是C++中造成资源获取/释放问题的根源,

3、scoped_ptr(局部智能指针)

  (1)、如何使用

  scoped_ptr是一个很类似auto_ptr的智能指针,但是scoped_ptr的所有权更加严格,不能转让,一旦scoped_ptr获取了对象的管理权,你就无法再从它那里取回来。

  平常的智能指针加上#include<memory>头文件,Boost库的搭建,就是拷到相应的目录下;然后编译,出错进去把该注释的都注释上。

#include<iostream>
#include<string>
#include<boost/smart_ptr.hpp> //:在include目录下的boost目录下的smart_ptr.hpp;
using namespace std;                    //打开就是其它智能指针的声明;                    
using namespace boost;  //boost库必须引入的命名空间


int main(void){
    int *p = new int(10);

    scoped_ptr<int> ps(p);
    cout<<*ps<<endl;  //有了指针功能*运算符
    string *px = new string("hello");
    scoped_ptr<string> ps1(px);
    cout<<ps1->size()<<endl;//有了->,指针
}

在库的引入下,确实具有智能指针的特性。必须加上

#include<boost/smart_ptr.hpp>  和  using namespace boost;,才具有智能指针的特性。

  对比:VC和VS版的拷贝构造,赋值都没问题,

  scoped_ptr(局部智能指针),对空间的管理权不能交由其它对象,不能进行拷贝构造和赋值。

4、scoped_ptr的内部实现过程

  如何达到拥有权不能转移的目的,拷贝构造和赋值语句声明为私有的,不需要实现。

  模拟源码实现如下:

#include<iostream>
using namespace std;                            

template<class T>
class scoped_ptr{
public:
    scoped_ptr(T *p = 0) : px(p){}
    ~scoped_ptr(){
        delete px;
    }
public:
    T& operator*()const{
        return *px;
    }
    T* operator->()const{
        return px;
    }
    T* get()const{
        return px;
    }/*
    void reset(T *p = 0){
        if(p != px && px){
            delete px;
        }
        px = p;
    }*/ //boost库中有一个更好的解决方案
    typedef scoped_ptr<T> this_type;
    void reset(T *p = 0){
        this_type(p).swap(*this); //无名临时对象技术
    }
    void swap(scoped_ptr &b){
        T *tmp = b.px;
        b.px = px;
        px = tmp;
    }
private: //不想让其拥有哪些功能,声明为私有即可。
    scoped_ptr(const scoped_ptr<T> &);//声明为私有,外部就无法进行拷贝构造了
    scoped_ptr& operator=(const scoped_ptr<T> &);//外部就调不动赋值语句了
    void operator==(scoped_ptr const &) const;  //对象不具有比较==
    void operator!=(scoped_ptr const &) const;  //对象不具有比较!=
    T *px;
};

class Test{
public:
    void fun(){
        cout<<"This is Test fun()"<<endl;
    }
};

int main(void){
    int *p = new int(10);

    scoped_ptr<int> ps(p);
    cout<<*ps<<endl;
    int *q = new int(20);
    ps.reset(q); //重新设置函数,将原有空间释放,重新管理一个空间

    
    scoped_ptr<Test> ps1(new Test);
    ps1->fun();
}

对reset()函数的理解:this_type(p).swap(*this);模型如下:

如何理解Boost库中的scoped_ptr

通过新生成的无名临时变量,将新地址与旧地址交换,在最后脱离函数范围,对象消亡,调用析构函数,释放

原先空间,达到不内存泄漏,并且对新空间进行管理。

缺点:不能对数组空间进行管理。

关于如何理解Boost库中的scoped_ptr就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI