个人免费网站如何做,电商培训心得体会,昆山门户网站,宁波网站搜索优化本节继续介绍智能指针#xff0c;不了解的读者可以先阅读——C11新特性之shared_ptr智能指针-CSDN博客
1.介绍 unique_ptr是C11标准提供的另一种智能指针。与shared_ptr不同的是#xff0c;unique_ptr指针指向的堆内存无法同其他unique_ptr共享#xff0c;也就是每一片堆内…本节继续介绍智能指针不了解的读者可以先阅读——C11新特性之shared_ptr智能指针-CSDN博客
1.介绍 unique_ptr是C11标准提供的另一种智能指针。与shared_ptr不同的是unique_ptr指针指向的堆内存无法同其他unique_ptr共享也就是每一片堆内存空间只能有一个unique_ptr指向。 每个unique_ptr指针指向的堆内存空间的引用计数都只能为1一旦指针放弃所指堆内存空间该空间立马释放回收。 2.用法 unique_ptr智能指针也是以模版类的形式提供的定义在memory头文件并位于std命名空间。在使用中首先要包含这两条语句。 1unique_ptr智能指针的创建 1.创建空指针。
std::unique_ptrint p1();std::unique_ptrint p2(nullptr);2.创建具体指向的指针。
std::unique_ptrint p3(new int);注意unique_ptr中没有类似make_shared()这样的模版函数 3.由于unique_ptr不共享内存因此没有拷贝构造函数只有移动构造函数。例如
std::unique_ptrint p4(new int);
std::unique_ptrint p5(p4);//错误堆内存不共享
std::unique_ptrint p5(std::move(p4));//正确调用移动构造函数对于调用移动构造函数的 p4 和 p5 来说p5 将获取 p4 所指堆空间的所有权而 p4 将变成空指针nullptr。 4.自定义释放规则。和 shared_ptr 指针不同为 unique_ptr 自定义释放规则只能采用函数对象的方式。例如
//自定义的释放规则
struct myDel
{void operator()(int *p) {delete p;}
};
std::unique_ptrint, myDel p6(new int); 2成员方法
operator*()——获取当前 unique_ptr 指针指向的数据。operator-()——重载 - 号当智能指针指向的数据类型为自定义的结构体时通过 - 运算符获取其内部的指定成员。operator ()——重载了 赋值号从而可以将 nullptr 或者一个右值 unique_ptr 指针直接赋值给当前同类型的 unique_ptr 指针。operator[]()——重载了 [] 运算符当 unique_ptr 指针指向一个数组时可以直接通过 [] 获取指定下标位置处的数据。operator bool()——unique_ptr 指针可直接作为 if 语句的判断条件以判断该指针是否为空如果为空则为 false反之为 true。get()——获取当前 unique_ptr 指针内部包含的普通指针。get_deleter()——获取当前 unique_ptr 指针释放堆内存空间所用的规则。release()——释放当前 unique_ptr 指针对所指堆内存的所有权但该存储空间并不会被销毁。reset(p)——其中 p 表示一个普通指针如果 p 为 nullptr则当前 unique_ptr 也变成空指针反之则该函数会释放当前 unique_ptr 指针指向的堆内存如果有然后获取 p 所指堆内存的所有权p 为 nullptr。swap(x) 交换当前 unique_ptr 指针和同类型的 x 指针。 除此之外C11标准还支持同类型的 unique_ptr 指针之间以及 unique_ptr 和 nullptr 之间做 ! 运算。 3.总结 unique_ptr对其所指对象拥有唯一所有权同一时间只能有一个unique_ptr指向同一个对象。当unique_ptr被销毁其所指对象也会自动销毁。 如有错误敬请指正