C++ unique_ptr

我对于unique_ptr的理解可能还有欠缺的地方,欢迎指正

头文件#include<memory>,但我在VS中发现不用这个头文件也可以

unique_ptr是C++的一个智能指针类型,它独占所指向的对象,并且可以实现自动释放,不需要再手动去delete,下面都以unique_ptr<int>来举例,它实际上封装了一个int类型的指针,int指针所指向的对象就称为unique_ptr所管理的对象,有四个经常使用的函数:move、release、get、reset

其中,move、release、get这三个函数都返回一个unique_ptr的指针,而reset返回空

并且,release、get、reset都是unique_ptr的成员函数,而move不是

move函数用来转移内存(因为两个不同的unique_ptr不能指向同一块内存)

release函数用来释放当前管理对象的指针,并返回它,这时候原unique_ptr就为nullptr

get函数返回存储的指针,并不会改变原unique_ptr管理对象的指针,这是与release的区别

reset函数显然就是根据形参来重置unique_ptr所管理的对象

举例:

1. unique_ptr<int> p;或者unique_ptr<int> p(nullptr); 

    结果:p为nullptr

2. unique_ptr<int> p(new int);

    结果:p不为nullptr,p指向一块还没有被初始化的内存

3. unique_ptr<int> p(new int(23));

    结果:*p的值为23

4. unique_ptr<int> p(new int(23));

    unique_ptr<int> q=p;

    结果:编译不通过,因为不可以两个unique_ptr指向同一块内存

5. unique_ptr<int> p = nullptr;

    结果:p为nullptr

6. unique_ptr<int> p = new int;或者unique_ptr<int> p = new int(12);

    结果:编译不通过

7. unique_ptr<int> p(new int(12));

    unique_ptr<int> q(move(p));或者unique_ptr<int> q = move(p);

    结果:p为nullptr,*q的值为12

8. unique_ptr<int> p(new int(12));

    unique_ptr<int> q(p.release());

    结果:p为nullptr,*q的值为12

    但是如果第二句改成unique_ptr<int> q = p.release();

    则会报错

9. unique_ptr<int> p(new int(12));

    unique_ptr<int> q(p.get());或者unique_ptr<int> q = p.get();

    结果:当然会出错,因为不能两个unique_ptr指向同一块内存

10. unique_ptr<int> p(new int(12));

      p.reset();或者p.reset(nullptr);

      结果:p为nullptr

11. unique_ptr<int> p(new int(12));

      p.reset(new int);或者p.reset(new int(23));

      结果:前者,p指向一块未初始化的内存,后者*p的值为23

12. unique_ptr<int> p(new int(12));

      unique_ptr<int> q;

      q.reset(p.release());

      结果:p为nullptr,*q的值为12

      但是如果把最后一句改成q.reset(move(p));就会报错

13. unique_ptr<int> p(new int(12));

      int* a = p.get();

      结果:此时*a的值为12,因为a与p指向同一块内存

      接着

      p.reset();

      结果:p为nullptr,但是a仍指向刚才那块内存!!(可以用*a去查看内存中的值,可以发现为一个乱七八糟的数,说明原本p       指向的内存已经被释放,但是a仍指向这块内存)所以,要使用a = nullptr;来真正释放这块内存,不然会造成内存泄漏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值