c++动态分配内存
### C++动态分配内存详解 #### 一、基本概念与基础知识自测题解析 ##### 7.1 填空题解析 **7.1.1 C/C++定义了4个内存区间:** - **代码区**:存放程序代码,包括函数体、字符串常量等不可变的数据。 - **全局变量与静态变量区**:用于存放全局变量或对象(包括静态变量)。这些变量在整个程序执行期间都存在。 - **局部变量区即栈(stack)区**:用于存放函数调用过程中的局部变量以及函数参数。每次函数调用时会为其分配新的栈空间,函数执行完毕后该空间会被释放。 - **自由存储区(freestore)**:也称为动态存储区或堆(heap)区,用于通过`new`关键字动态分配的内存空间。 **7.1.2 静态定义的变量和对象用标识符命名,称为**: - **命名对象**:即通过标识符直接访问的对象或变量。 - **动态建立的称为无名对象**,这些对象是通过`new`运算符创建的,没有显式的名称,通常通过指针来访问。 - **动态建立对象的初始化是通过初始化式(initializer)实现**,初始化式可以是一个表达式或者值,用来设置对象的初始状态。 - **显式初始化**:指的是在创建对象时明确指定初始值的过程。 **7.1.3 在用new运算符建立一个三维数组15*30*10时**: - 使用了**3个下标运算符**,因为这是一个三维数组。 - 对应的用`delete`运算符注销这个三维数组时使用了**1个下标运算符**,这是因为在删除动态数组时只需提供指向数组起始地址的指针。 - `new`返回的指针是指向**30行10列的二维数组**的指针。 **7.1.4 当动态分配失败,系统采用**: - **返回一个空指针(NULL)** 来表示发生了异常。如果`new`返回的指针丢失,则所分配的自由存储区空间无法收回,这种情况称为**内存泄漏**。 - 这部分空间必须在**重新启动计算机后**才能找回,这是因为无名对象的生命期**并不依赖于建立它的作用域**。 **7.1.5 按语义的默认复制构造函数和默认复制赋值操作符实现的复制称为**: - **浅拷贝**:这种复制只是简单地复制对象的引用计数或其他引用信息,而不是复制实际的数据结构。 - 如果类对象`obj`中有一个数据成员为指针,并为这个指针动态分配一个堆对象,如用`obj1`按成员语义拷贝了一个对象`obj2`,则`obj2`对应指针指向**同一个堆对象**。 **7.1.6 单链表的结点包含两个域**: - **数据域**:用于存储数据。 - **指针域**:用于存储指向下一个结点的地址。 - 使用链表的最大优点是**用多少空间,开多少空间**,即链表的大小可以根据需要动态调整。 **7.1.7 进入单链表必须通过单链表的**: - **头指针**:是访问链表的唯一入口点。 - 如果它丢失则**链表整个丢失**,内存也会发生泄漏。 - 在单链表中进行的查找只能是**顺序查找**。 **7.1.8 对链栈,链的生成必须是向**: - **向前**生成,最新压栈的元素放在**链表头的位置**,弹出时从**链表头**删除结点。 - 对链队,采用向**后**生成,新入队的结点放在链的**尾部**,出队操作在**链表头**位置。 **7.1.9 在计算机中进行表达式的计算,为解决优先级和运算的结合性,必须使用**: - **数栈**和**运算符栈**。在中缀表达式中,每个双目运算符放在**它的两个运算符之间**。 **7.1.10 为了能重复利用一个队空间,要求把队说明成一个逻辑上的**: - **循环队列**。 **7.1.11 二叉树的特点是**: - **每个结点最多有两个孩子**。 - **子树有左右之分**。 **7.1.12 二叉树的遍历是按**: - **访问子树根节点次序**分类,其中中序遍历是**先遍历该子树根结点的左子树回来后,接着再访问根结点,最后遍历右子树**。 **7.1.13 二叉排序树又称**: - **二叉搜索树**或**树表**。 - 其左子树上的所有结点均小于根结点的数据值,而右子树上的所有结点均大于根结点的数据值。 - 采用**中序遍历**就可以得到一个**升序序列**。 #### 二、简答题解析 **1. new运算符为一个变量或对象分配存储空间和为一个数组分配存储空间,使用方法上有什么不同?对应的delete运算符使用有什么不同?** - 为一个变量或对象分配存储空间其使用的格式如下:`指针变量名=new类型名(初始化式);`。 - 对于数组进行动态分配和撤销的格式为:`指针变量名=new类型名[下标表达式];`,后者多一个`[下标表达式]`,同时不能进行初始化。 - 对应的`delete`运算符使用分别为:`delete指针名;` 和 `delete[]指向该数组的指针变量名;`。后者多一个方括号,如果`delete`语句中少了方括号,因编译器认为该指针是指向数组第一个元素的指针,会产生回收不彻底的问题(只回收了第一个元素所占空间),加了方括号后就转化为指向数组的指针,回收整个数组。`delete[]`的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。 **2. 用delete删除p所指向的无名对象时,p指针也同时被删除了,对不对?为什么?** - 不对。`delete`操作只释放了`p`所指向的无名对象占用的内存空间,撤销了该无名对象,但指针`p`本身并没有撤销,它仍然存在,该指针所占内存空间并未释放。 **3. 为什么动态建立类对象数组时,类的定义一定要有缺省的构造函数?** - 当使用`new`运算符创建类对象数组时,系统会自动调用构造函数来初始化数组中的每一个对象。如果类中没有显式声明任何构造函数,则会使用缺省的构造函数来初始化每个对象。如果没有缺省构造函数,编译器将无法为数组中的对象正确初始化,从而导致编译错误。因此,为确保能够正确创建和初始化类对象数组,类的定义中必须包含至少一个缺省的构造函数。
剩余32页未读,继续阅读
- zhongguanxin2014-10-01这么长的程序得好好研究一翻了!
- 高逸2013-04-06不错的东西,初学者可以学习
- 舒泽昊2014-03-12一直头疼动态内存,这个文档正好可以好好阅览一下。谢了
- 粉丝: 84
- 资源: 71
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 360国贸纽约城市&女神像.rar
- 更新城市蔓延指数数据集(1990-2023年).xlsx
- datafor3dgs
- 安卓大作业-基于AndroidStudio开发的星座app项目源码(高分项目)
- xplore_tehb_v4.39.00_2265.com.apk
- 基于Python和Django框架的个性化书籍推荐管理系统开发
- 给你一个jingqsdfgnvsdljk
- JDK1.8版本出现SecurityException: JCE cannot authenticate the provider BC错误
- Python实现基于LSTM的日志异常检测系统源码+数据集(高分项目)
- Screenshot_20241125_185209.jpg