一、为什么要使用智能指针?
1.1 动态内存和使用原因
程序使用内存大概可以分为“堆栈全常代”[1],和智能指针相关的是堆区,堆(heap)在C++中也被称为自由空间。自由空间的“自由”应该理解为程序员自己编写的自主控制其生命周期的空间,申请的空间大小相对宽裕[2]。
出于三个原因要使用动态内存
- 程序不知道自己要使用多少对象。容器
- 程序不知道所需对象的准确类型。多态
- 程序需要在多个对象间共享数据。应用
除此,智能指针是异常安全的。即异常退出也会成功释放对应内存。
1.2 管理动态内存的方法虽然C++程序员可以使用new和delete完成对动态内存的申请和释放,但是该方式不正确使用会出现“内存泄漏”、“多次释放同一空间”等问题,前者忘记释放,后者无意多次释放。为了减少这种管理动态内存上出错概率,智能指针就出现了!C++有四个智能指针分别是: auto_ptr
, unique_ptr
,shared_ptr
, weak_ptr
, 其中后三个是C++11支持,auto_ptr于C++17被移除[3]。
#include
中可以找到这些智能指针的定义,主要
template
explicit shared_ptr( Y* ptr );
template
shared_ptr( Y* ptr, Deleter d );//删除器版本
template class unique_ptr;
template class unique_ptr;
template class weak_ptr;
template class auto_ptr;
template class auto_ptr;
shared_ptr和unique_ptr 都能够帮助程序员管理好内存释放时机,但是前者指的是可以由多个shared_ptr管理,后者只能通过一个unique_ptr管理。
unique_ptr因为不用管理引用计数,效率可以和原始指针相媲美[5]。
std::shared_ptr sp = std::make_shared(2, 3);
std::shared_ptr ssp(sp);
std::shared_ptr sssp(ssp);
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脚手架写一个简单的页面?