第12章 动态内存

  • 生存期
    • 全局对象:程序启动时分配,程序结束时销毁
    • 局部对象:进入其定义所在的程序块时被创建,离开块时被销毁
    • static对象:第一次使用前被分配,程序结束时销毁
    • 动态分配的对象:只有当显式地被释放时,才会被销毁
  • 程序内存:
    • 静态内存:局部static对象,类static数据成员,定义在任何函数外的变量→使用前分配内存,程序结束时销毁;
      • 局部static对象:令局部变量的声明周期贯穿函数调用及之后的时间,在程序执行路径第一次经过对象定义语句时初始化,知道程序终止被销毁
    • 栈内存:定义在函数内的非static对象→仅在其定义的程序块运行时存在;
      • 分配在静态或者栈内存中的对象由编译器自动创建和销毁
    • 动态内存:动态分配,生存期由程序控制→显示创建,显示销毁。
  • 动态内存:
    • new创建,delete销毁→确保正确释放内存困难。
    • (c++11)智能指针:shared_ptr 允许多个指针指向同一对象,unique_ptr 不允许...., weak_ptr 伴随类?,弱引用?,指向shared_ptr指向的对象。→memory头文件中
  • 使用动态生存期的资源:
    • 程序不知道自己需要多少对象;
    • 程序不知道所需对象的准确类型;
    • 程序需要在多个对象间共享数据。

零、术语表

一、动态内存和智能指针

  1. shared_ptr类
  • 模板类→创建:shared_ptr<string> p1; shared_ptr<list<int>> p2;

  • 初始化:

    • 默认初始化→保存空指针;
    • 其他方式?(12.1.3)
  • 操作:
    shared_ptr和unique_ptr共有:shared_ptr<T> sp;p;*p;p->mem;p.get()?; swap(p,q);p.swap(q)
    shared_ptr 独有:make_shared<T> (args);shared_ptr<T> p(q);p=q;p.unique();p.use _count()

  • make_shared函数

    • 最安全的分配和使用动态内存的方法,memory头文件;
    • 类似顺序容器的emplace成员,用其参数来构造给定类型的对象;
      eg. shared_ptr<int> p1 = make_shared<int>(42);
      shared_ptr<string> p2 = make_shared<string>(10,'9');
    • 不传递参数时→值初始化;
  • shared_ptr的工作原理:

    • 可认为每个shared_ptr都有一个关联的计数器(引用计数);
    • 一旦计数器变为0,会自动释放所管理的对象→通过析构函数销毁, - shared_ptr的析构函数 递减它指向对象的引用计数/计数为0时释放内存;
    • 计数器:
      • 拷贝→计数器递增;
      • 赋值p = q → p指向对象计数递减,q指向对象计数递增;
      • 返回p→ 需要向调用者传递一个p的拷贝,计数递增。
      • shared_ptr被销毁,例如一个局部的shared_ptr离开其作用域→计数器递减
    • 由于在最后一个shared_ptr销毁前内存都不会释放,所以需要保证shared_ptr在无用之后不再保留;
  • 回顾知识点:
    基于const的重载→通过区分成员函数是否是const对其重载,分别适用于常量版本和非常量版本的对象。
    initializer_list→6.2.6

  1. 直接管理内存
  • 使用new分配和初始化对象:new无法为分配的对象命名,而是返回一个指向该对象的指针:int *pi = new int;
  • 初始化:
    • 默认初始化→默认状况下使用,(内置类型或组合类型对象的值未定义,类类型用默认构造函数);
      • 定义变量时没有指定初值,则变量被默认初始化
      • 内置类型,定义于任何函数体之外被初始化为0,否则不被初始化,值是未定义的→建议初始化每一个内置类型的变量
    • 直接初始化→圆括号,int *pi = new int(1024), string *s = new string(10,'9');
    • 列表初始化 vector<int> *p = new vector<int>{0,1,2,3,4,5}
    • 值初始化:→int *p = new int();
      • 内置类型,初始值设为0
      • 其余类型,默认初始化
  • 可以用new分配const对象:const int *pci = new const int(1024)→该对象必须初始化。
  • 使用delete释放内存:接受一个指向想要释放对象的指针:delete p,p必须指向一个动态分配的对象或空指针!,动态分配的const对象不可被改变但可被销毁。
    • 执行两个动作:销毁给定指针指向的对象,释放对应的内存。
    • 指向动态对象的指针必需记得在不用时释放内存,eg,当一个指针离开其作用域,它指向的对象什么都不会发生,如果是一个指向动态对象的指针,那么内存将不被释放。
  • new,delete使用常见问题
    • 忘记delete内存;
    • 使用已经释放掉的对象;
    • 同一块内存释放两次;
  • 空悬指针:指向一块曾经保存数据对象,但现在已经无效的内存的指针,如:int *p = new int(43); auto q = p; delete p;→q现在是一个空悬指针。
  1. shared_ptr和new结合使用

  2. unique_ptr

  3. weak_ptr

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 12.1 智能指针 智能指针行为类似普通指针,但它负责自动释放所知的对象。 #include <memory> s...
    龙遁流阅读 331评论 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,446评论 1 51
  • 内存管理 C++使用new和delete两个运算符进行内存管理。 使用new进行动态分配和初始化对象 在自由空间内...
    plantom阅读 307评论 0 1
  • 1. 什么是智能指针? 智能指针是行为类似于指针的类对象,但这种对象还有其他功能。 2. 为什么设计智能指针? 引...
    MinoyJet阅读 619评论 0 1
  • 人这辈子就是为了一个情。 年少,我们重视友情,因为友情让我们快乐;青春,我们忠实爱情,因为爱情让我们幸福;人成熟了...
    爱粉阅读 272评论 6 7