第十二章、动态内存

一、动态内存与智能指针

1、new:在动态内存中为对象分配空间并返回一个指向该对象的指针;delete:接受一个动态对象的指针,销毁该对象,并释放与之关联的内存

2、两种指针:shared_ptr和unique_ptr;还有一个weak_ptr;都定义在memory中

二、shared_ptr类:智能指针也是模板,需要提供指向的类型

1、一个条件判断中使用智能指针,效果就是检测它是否为空

2、最安全的分配和使用动态内存的方法是调用make_shared的标准库函数

  • 返回指向此对象的shared_ptr
  • 通常用auto定义一个对象来保存make_shared的结果
  • auto p = make_shared<int>(42);

3、使用动态内存的原因三个

  • 程序不知道自己需要使用多少对象
  • 程序不知道需要对象的准确类型
  • 程序需要在多个对象间共享数据

4、对动态分配的对象进行初始化通常是个好主意:定义的时候就初始化

5、不能将一个内置指针隐式转换为一个智能指针,必须使用直接初始化形式

    shared_ptr<int> p(new int(1024));

6、不要混用普通指针和智能指针,除非我们需要向不能使用智能指针的代码传递一个内置指针

  • 比如shared_ptr不支持指针的算术运算,所以为了访问数组中的元素,必须使用get获取一个内置指针,然后来访问数组元素

7、避免智能指针陷阱

  • 不适用相同的内置指针值初始化(或reset)多个智能指针
  • 不delete get()返回的指针:当智能指针自己被销毁后,自动失效
  • 不使用get()初始化或reset另一个智能指针
  • 如果使用智能指针管理的资源不是new分配的内存,记住传递给他一个删除器
    • shared_ptr<connection> p(&c, end_connection);
    • 因为shared_ptr默认使用delete处理

三、unique_ptr类

1、定义一个unique_ptr时,必须绑定到一个new返回的指针上,且必须采用直接初始化形式

    unique_ptr<int> p(new int(42));
  • 不支持make_shared类似的操作:在c++14里出现了make_unique

2、unique_ptr拥有它指向的对象,因此unique_ptr不支持普通的拷贝或赋值操作,但有两个例外

  • 从函数返回一个unique_ptr
  • 返回一个局部对象的拷贝

3、可以通过release或reset将指针的所有权从一个非const的unique_ptr转移到另一个unique

4、向unique_ptr传递删除器,必须在尖括号中类型后,提供删除器类型:这里与shared_ptr的删除器不同

    unique_ptr<objT, delT> p (new objT, fcn);

四、weak_ptr:将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。最后一个指向对象的shared_ptr被销毁,对象就会释放

  • 由于对象可能不存在,所以要使用时,必须调用lock来判断weak_ptr指向的对象是否仍存在
    if(shard_ptr<int> np = wp.lock())
    {
        ...
    }
    • w.lock():如果计数为0则返回一个空的shared_ptr;否则返回一个指向w的对象的shared_ptr

五、动态数组

  • int *pia = new int[10];
  • delete []pia;pia前面必须有[]
时间: 2024-10-11 21:47:07

第十二章、动态内存的相关文章

第十二章 动态内存与智能指针

动态内存与智能指针 [智能指针]头文件#include<memory>shared_ptr: 允许多个指针指向同一个对象unique_ptr: "独占"所指向的对象weak_ptr:伴随类,它是一种弱引用,指向shared_ptr所管理的对象. 原文地址:https://www.cnblogs.com/sunbines/p/8552298.html

《C++编程思想》 第十二章 动态对象创建 (习题+解答)

一.相关知识点 重载new和delete 当创建一个new表达式时有两件事发生.首先,使用运算符new分配内存,然后调用构造函数.在delete表达式里,调用析构函数,然后使用运算符delete释放内存.我们永远无法控制构造函数和析构函数的调用(否则我们可能意外地搅乱它们),但可以改变内存分配函数运算符new和delete. 被new和delete使用的内存分配系统是为通用目的而设计的.但在特殊的情形下,它不能满足我们的需要.改变分配系统的原因是考虑效率:我们也许要创建和销毁一个特定的类的非常多

第十二章 分配内存: malloc ()与free () 及calloc()

 malloc () : 它接受一个参数,即所需内存字节数.如果成功,则返回该空间首地址,该空间没有初始化,如果失败,则返回NULL ,(但是找到的内存是匿名的) (分配类型 *)malloc(分配元素个数 *sizeof(分配类型)) 例子: double * ptb; ptb = (double * ) malloc (30 * sizeof (double )); 这段代码请求30个 double类型值的空间,并且把ptb指向该空间所在位置,注意ptb是作为一指向一个double类型值

第二十二章 动态分区管理(LPAR)

一.逻辑分区 Lpar即系统级的逻辑分区,它把一台计算机上的硬件资源划分成多个不同的逻辑服务器,每个逻辑服务器上单独运行一个私有的操作系统,这样就可以实现在一台服务器上多个操作系统的运行. 根据在逻辑分区中调配资源是否需要重启这个分区中的操作系统,可以把逻辑分区分成两种:静态Lpar和动态Lpar.静态Lpar是指系统资源(CPU.内存和I/O等)在不同的分区之间移动的时候需要重新启动所有影响到的Lpar,而动态Lpar则可以使用户在不同的分区之间灵活移动资源时不会影响到分区的正常运行,既不需要

【读书笔记】C#高级编程 第十二章 动态语言扩展

(一)DLR C#4的动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务. (二)dynamic类型 dynamic类型允许编写忽略编译期间的类型检查的代码.编译器假定,给dynamic类型的对象定义的任何操作都是有效的,在运行之前编译器不会检测是否存在错误. 例子: dynamic person = "人"; string firstName = person.FirstName; 这两行代码能够通过编译器编

c++第十二章 -(动态管理内存、动态数组和函数返回动态内存)

1.静态内存,编译时申请,存储在栈,如基本数据类型. 2.动态内存由一些没有名字,只有地址的内存块构成.那些内存块是在程序运行期间动态分配的.它们来自一个标准c++库替你管理的“大池子”(内存池),从内存池申请一些内存需要用new语句,他将根据你提供的数据类型分配一块大小适当的内存.你不必担心内存块的尺寸问题. 3.注意在用完内存块之后,应该用delete语句把它返还内存池.另外作为一种附加的保险措施,在释放内存之后还要把关联的指针置NULL,对空指针进行“解引用”会报错. class Comp

C Primer Plus (第五版) 第十二章 存储类、链接和内存管理 编程练习

第十二章 存储类.链接和内存管理 编程练习 1.Q不使用全局变量,重写程序清单13.4 #include <stdio.h>; int critic(int u); int main(void) { int units; printf("How many pounds to a firkin of butter?\n"); scanf_s("%d", &units); while (units != 56) critic(units); prin

第十二章 APO编程语言

第十二章      APO编程语言 APO编程语言是基于汇编语言和面向对象编程.基本指令只有7种:赋值指令.COPY指令.BTX(位X测试为1.或0转移)指令.查表跳转指令switch(RN){-.}.移位与循环指令S.三操作数运算指令.调用与返回指令.所有的指令大小.除了32位立即数赋值是2字外:其它都是32位,一个字. 指令执行时间,除了32位立即数赋值是2ns.COPY指令取决于拷贝的长度外:其它指令都是1ns. 应用程序只能使用R0-R4,R8-R15的21个寄存器作为高速的寄存器局部变

c++ primer plus(第6版)中文版 第十二章编程练习答案

第十二章编程练习答案 12.1根据以下类声明,完成类,并编小程序使用它 //12.1根据以下类声明,完成类,并编小程序使用它 #include <iostream> #include <cstring> using namespace std; class Cow{ char name[20]; char * hobby; double weight; public: Cow(); Cow(const char * nm, const char * ho, double wt);

第十二章、软件包管理

第十二章.软件包管理 本章内容 ?软件运行环境 ?软件包基础 ?rpm包管理 ?yum管理 ?定制yum仓库 ?编译安装 软件运行和编译 ABI:Application Binary Interface Windows与Linux不兼容 ELF(Executable and Linkable Format) PE(Portable Executable) 库级别的虚拟化: Linux: WINE Windows: Cywin API:Application Programming Interfa