我对于unique_ptr的理解可能还有欠缺的地方,欢迎指正
头文件#include
unique_ptr是C++的一个智能指针类型,它独占所指向的对象,并且可以实现自动释放,不需要再手动去delete,下面都以unique_ptr
其中,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
结果:p为nullptr
2. unique_ptr
结果:p不为nullptr,p指向一块还没有被初始化的内存
3. unique_ptr
结果:*p的值为23
4. unique_ptr
unique_ptr
结果:编译不通过,因为不可以两个unique_ptr指向同一块内存
5. unique_ptr
结果:p为nullptr
6. unique_ptr
结果:编译不通过
7. unique_ptr
unique_ptr
结果:p为nullptr,*q的值为12
8. unique_ptr
unique_ptr
结果:p为nullptr,*q的值为12
但是如果第二句改成unique_ptr
则会报错
9. unique_ptr
unique_ptr
结果:当然会出错,因为不能两个unique_ptr指向同一块内存
10. unique_ptr
p.reset();或者p.reset(nullptr);
结果:p为nullptr
11. unique_ptr
p.reset(new int);或者p.reset(new int(23));
结果:前者,p指向一块未初始化的内存,后者*p的值为23
12. unique_ptr
unique_ptr
q.reset(p.release());
结果:p为nullptr,*q的值为12
但是如果把最后一句改成q.reset(move(p));就会报错
13. unique_ptr
int* a = p.get();
结果:此时*a的值为12,因为a与p指向同一块内存
接着
p.reset();
结果:p为nullptr,但是a仍指向刚才那块内存!!(可以用*a去查看内存中的值,可以发现为一个乱七八糟的数,说明原本p 指向的内存已经被释放,但是a仍指向这块内存)所以,要使用a = nullptr;来真正释放这块内存,不然会造成内存泄漏