1. 对象的生存期

内存类型 定义 分配和销毁时机
全局对象 程序启动时分配,程序结束时销毁
静态内存 局部static对象类static数据成员 第一次使用时分配,程序结束时销毁
栈内存 定义在函数内的非static对象局部自动对象 进入块时分配,离开块时销毁
动态内存 定义在任何函数之外的变量 程序用堆来存储动态分配的对象显式创建,显式销毁

2. 以前的内存管理

2.1 new 创建内存对象, delete删除内存对象

//直接初始化方式来初始化一个动态分配的对象
int *pi = new int(2104);
string *ps = new string(10, '9');
vector<int> *pv = new vector<int>{0,1,2,3,4,5,6};//值初始化,在类型名后加一对空括号即可
string *ps1 = new string;
string *ps2 = new string();
int *pi1 = new int;
int *pi2 = new int();

2.1 动态分配的const对象

const int *pci = new const int(1024);
const string *pcs = new const string;//返回一个指向const的指针

2.1. delete风险

dangling pointer: 被delete后的指针

//这种保护也是有限的, p虽然是空了,但是q还是在的。delete之后得重置指针值为null
int *p(new int(42));
auto q = p;
delete p;
p = nullptr

3. 智能指针

指针类型 说明
shared_ptr 允许多个指针指向同一个对象
unique_ptr 某个时刻只能有一个 unique_str 指向一个给定对象
weak_ptr 弱引用,指向shared_ptr所管理的对象

shared_ptr 和unique_ptr都支持的操作

操作 说明
shared_ptr sp unique_ptr up 空智能指针,可以指向类型为T的对象
p 将p用作一个条件判断,若p指向一个对象,则为true
*p 解引用p,获得它指向的对象
p->mem 等价于(*p).mem
p.get() 返回p中保存的指针,要小心使用;若智能指针释放了其对象,返回的指针所指向的对象也就消失了
swap(p,q)/p.swap(q) 交换p和q中的指针

C++ Primer 5th笔记(chap 12 动态内存)智能指针概述相关推荐

  1. C++ Primer 5th笔记(chap 12 动态内存)shared_ptr

    1. 相关概念 1.1 使用场景 • 程序不知道自己需要使用多少对象 • 程序不知道所需对象的准确类型 • 程序需要在多个对象间共享数据 1.2 实现原理 shared_ptr对象有一个关联的计数器, ...

  2. C++ Primer 5th笔记(chap 12 动态内存)allocator类

    1. 标准库allocator类及其算法 算法 说明 allocator <.T> a 定义了一个名为a的allocator对象,他可以为类型T的对象分配内存 a.allocate(n) ...

  3. C++ Primer 5th笔记(chap 12 动态内存)动态数组

    1. 初始化动态分配对象的数组 int *pia=new int[10]; //10个没有初始化的int int *pia2=new int[10](); //10个初始化为0的int string ...

  4. C++ Primer 5th笔记(chap 12 动态内存)unique_ptr

    1. 定义 定义一个unique_ptr时,需要将其绑定到一个new返回的指针上. unique_ptr p1; unique_ptr p2(new int(42)); 2. unique_ptr 不 ...

  5. C++ Primer 5th笔记(chap 12 动态内存)weak_ptr

    weak_ptr是一种不控制所指向兑现生存周期的智能指针,它指向一个由shared_ptr管理的对象. 引入lock和expired是防止在weak_ptr 不知情的情况下,shared_ptr 被释 ...

  6. C++ Primer Plus学习笔记之类和动态内存分配

    前言 个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系. 一直以来都很想深入学习一下C++,将其作为自己的主力开发语言.现在为了完成自己这一直以来的心愿,准备 ...

  7. C++ Primer 5th笔记(chap 16 模板和泛型编程)定义

    1. 函数模板 template <typename T> int compare (const T &v1,const T &v2) {if (v1 < v2) r ...

  8. C++学习笔记-DLL中动态内存管理

    动态内存管理 在dll中malloc的内存,必须在dll中free 注:这是由Windows自己的特点决定! 如果 a 编译成静态库,有下面两种解决方法: 1.b.dll 和 c.dll 使用同一个款 ...

  9. C++ primer 5th笔记

    目录2022年11月25日 周五 阴 第一.二章:变量和基本类型 基本内置类型 unsigned float与double 'A'与"A" 布尔类型转换时 初始化与赋值 初始化 声 ...

最新文章

  1. 关掉可穿戴部门后,英特尔还将调整自动驾驶业务
  2. 我的Android进阶之旅------gt;Java全角半角的转换方法
  3. JS原始类型:数值的运用技巧
  4. Linux网络编程 | 信号 :信号函数、信号集、统一事件源 、网络编程相关信号
  5. nginx 返回动态Html,Nginx负载均衡 -Nginx动态更新upstream
  6. 为什么要在网站上主动放置沃通全球可信网站认证标志
  7. java samphore 连接池_ADOConnection数据库连接池
  8. 《C++(三)--多线程方法总结》
  9. Extjs介绍及视频教程
  10. tomcat7下载安装
  11. 什么是0day漏洞?如何预防0day攻击?
  12. python是脚本还是编程语言_python语言是脚本语言吗
  13. 小程序获取openid时报40125
  14. java Runtime.exec方法详解
  15. Briarcliff Entertainment 购买了关于开创性的非裔美国 NBA 球员的电视剧“Sweetwater”(独家)
  16. python按日期爬取b站弹幕 2.0版
  17. 使用c语言实现图像中值滤波,图像处理之中值滤波介绍及C实现
  18. PHPWord在文档中插入表格
  19. SQL 查询语句 IIF()处理条件判断
  20. php blog 博客程序那个好

热门文章

  1. Android --- This project contains Java compilation errors,which can cause rendering failures for
  2. java实现8、10、16、2进制之间的相互转换(简单易懂实用快速)
  3. vectornator安卓_Vectornator Pro
  4. word置顶_小鱼便签怎么设置置顶
  5. mongodb 重启_mongodb历险记
  6. 如何将网页保存为图片_如何用浏览器插件一键批量下载网页图片?
  7. mysql 字段属性命令_mysql 操作字段 命令
  8. mysql数据库试题下载_MYSQL数据库2013-2014学年考试试卷
  9. 成功解决dos内的输入ipconfig出现错误:不是内部或外部命令……
  10. 成功解决TypeError: __init__() got an unexpected keyword argument 'indices'