• C++11智能指针之unique_ptr


    unique_ptr的作用

    只能独一无二地拥有某堆空间的对象。

    释放对象的几种方式

    1、自动释放。普通变量,系统分配对象到栈上,出作用域时会自动析构。
    2、手动释放 方式1:将对象置为nullptr。
    3、手动释放 方式2:调用reset()函数。
    4、手动释放 方式3:调用get_deleter()获取到deleter函数,调用get()获取到指针,然后执行deleter函数。
    代码如下:

    class Test
    {
    public:
    	Test(){}
    	~Test()
    	{
    	    cout <<"destructor" <<endl;
    	}
    };
    
    unique_ptr<int> up1(new int(11));
    cout << "*up1=" <<*up1 <<endl;  //重载了operator *()
    {
        unique_ptr<Test> up2(new Test());
    //        up2 = nullptr;    //手动释放 方式1
    //        cout << "111111111"<
    //        up2.reset();        //手动释放 方式2
    //        cout << "22222222"<
        default_delete<Test> deleter= up2.get_deleter();
        deleter(up2.get());     //手动释放 方式3
        cout << "33333333"<<endl;
    }//up2生命周期结束,自动释放
    cout << "---------------"<<endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    禁用拷贝构造函数,可以移动

    可以看下C++文档定义:
    unique_ptr& operator= (const unique_ptr&) = delete;
    即是禁用拷贝赋值函数的。

    unique_ptr<int> up1(new int(11));
    //unique_ptr up2=up1;    //禁用拷贝构造函数
    unique_ptr<int> up2=std::move(up1);//可以移动    
    cout << "*up2=" <<*up2 <<endl;   
    
    unique_ptr<int> up3(std::move(up2)); //移动构造
    cout << "*up3=" <<*up3 <<endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    reset的两个作用

    reset函数可以不带参数,也可以带参数。如果是无参,则是释放堆空间;如果是有参,则是先释放原有堆空间,然后重新绑定一个堆区空间。

    unique_ptr<int> up1(new int(11));
    //up1.reset();    //如果是无参,则是释放堆空间
    up1.reset(new int(22)); //如果是有参,则是先释放原有堆空间,然后重新绑定一个堆区空间
    cout << "*up1=" <<*up1 <<endl;
    
    • 1
    • 2
    • 3
    • 4

    release的作用

    release的作用:释放控制权,不释放堆区空间。

    unique_ptr<int> up1(new int(11));
    //释放控制权,不释放堆区空间
    int* p=up1.release();
    cout << "*p=" <<*p <<endl;
    //cout<<"*up1="<<*up1<
    delete p;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    判断指针是否为空的方法

    判断指针是否为空的方法:(1)!up1 (2) null (3)nullptrup3.get()

    unique_ptr<int> up1(new int(11));
    unique_ptr<int> up2;
    unique_ptr<int> up3=nullptr;
    
    if(!up1)
    {
        cout << "up1 is null" << endl;
    }
    if(nullptr == up2)
    {
        cout << "up2 is null" << endl;
    }
    if(nullptr==up3.get())
    {
        cout << "up3 is null" << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    交换

    交换: (1)unique_ptr成员函数swap (2)全局模板函数swap。

    unique_ptr<int> up1(new int(11));
    unique_ptr<int> up2(new int(22));
    unique_ptr<int> up3=nullptr;
    
    //unique_ptr成员函数swap
    cout << "*up1=" << *up1 << ", **up2=" << *up2 << endl;
    up1.swap(up2);
    cout << "*up1=" << *up1 << ", **up2=" << *up2 << endl;
    
    //全局模板函数swap
    std::swap(up1, up2);
    cout << "*up1=" << *up1 << ", **up2=" << *up2 << endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    CSRF +self xss的运用【DVWA测试】
    学习如何使用最强大的 JavaScript 函数
    公共命名空间中的依赖关系
    PHP报错:Warning: preg_match_all(): Unknown modifier ‘<‘
    HCIE-HCS规划设计搭建
    Cortex-M3/M4基础
    Mybatis——SqlSession的工作流程
    基于STM32倒车雷达系统(OLED显示)(Proteus仿真+程序+设计报告)
    IOCP与ASIO关系
    虹科分享 | 简单实用的CANopen介绍,看完你就明白了(3)——对象字典、SDO、PDO
  • 原文地址:https://blog.csdn.net/xiongpursuit88/article/details/128084188