简单地说,C++智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能够及时、妥善地销毁动态分配的数据,并实现了明确的对象生命周期,因此更有价值。
2.常规指针存在的问题C++在内存分配、释放和管理方面向程序员提供了全面的灵活性。但是这种灵活性是把双刃剑,一方面它使C++成为一种功能强大的语言,另一方面它让程序员能够制造与内存相关的问题,比如内存泄漏(用完未释放,遗漏掉了)。
例如在堆声明和分配的内存,析构方法是否会自动销毁对象,又或是方法结束后需要一个个释放,方法存在很多返回的地方,每个返回语句都要执行很多相关释放操作,十分繁琐,用智能指针就能实现其自动释放。
3.智能指针有何帮助鉴于使用常规指针存在的问题,当C++程序猿需要管理堆中的数据时,可使用智能指针的方式分配和管理内存。
4.智能指针智能指针类重载了解除引用运算符(*)和成员选择运算符(->)。
同时为了能够在堆中管理各种类型,几乎所有的智能指针都是模板类,包含其功能的泛型实现。
二、unique_ptr 简介 1.概念unique_ptr 是从 C++ 11 开始,定义在 中的智能指针(smart pointer)。它持有对对象的独有权,即两个 unique_ptr 不能指向一个对象,不能进行复制操作只能进行移动操作。
unique_ptr 之所以叫这个名字,是因为它只能指向一个对象,即当它指向其他对象时,之前所指向的对象会被摧毁。其次,当 unique_ptr 超出作用域时,指向的对象也会被自动摧毁,帮助程序员实现了自动释放的功能。
unique_ptr 也可能还未指向对象,这时的状态被称为 empty。
2.简单示例std::unique_ptrp1(new int(5));
std::unique_ptrp2=p1;// 编译会出错
std::unique_ptrp3=std::move(p1);// 转移所有权, 现在那块内存归p3所有, p1成为无效的针.
p3.reset();//释放内存.
p1.reset();//无效
三、unique_ptr 详解
1.定义
unique_ptr 在 中的定义如下:
// non-specialized
template class unique_ptr;
// array specialization
template class unique_ptr;
其中 T 指其管理的对象类型,D 指该对象销毁时所调用的释放方法,可以使用自定义的删除器,他也有一个默认的实现,即 detele 操作。
2.常用方法介绍2.1 构造方法 std::unique_ptr::unique_ptr
// unique_ptr constructor example
#include
#include
int main () {
std::default_delete d;
std::unique_ptr u1;
std::unique_ptr u2 (nullptr);
std::unique_ptr u3 (new int);
std::unique_ptr u4 (new int, d);
std::unique_ptr u5 (new int, std::default_delete());
std::unique_ptr u6 (std::move(u5));
std::unique_ptr u7 (std::move(u6));
std::unique_ptr u8 (std::auto_ptr(new int));
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?