### 动态内存分配 #### 引言 在软件开发过程中,内存管理是至关重要的一个环节,它直接关系到程序的性能与稳定性。对于很多应用而言,在编译时无法确切知道所需内存空间的具体大小,因此就需要用到动态内存分配技术。本文将基于提供的PPT内容,详细介绍动态内存分配的基本概念、应用场景、以及与静态内存分配的区别。 #### 为什么需要动态内存分配? 动态内存分配主要解决的问题是在编译时未知的内存需求。例如,当设计一个用于存储客户信息的数据结构时,由于新客户可能随时加入,我们无法在编写代码时就确定所需的内存大小。在这种情况下,如果使用静态内存分配,则可能会导致内存浪费或内存不足的情况发生。而动态内存分配则可以在运行时根据实际需要分配内存,更加灵活高效。 #### 动态内存分配与静态内存分配的区别 1. **名称绑定**:动态分配的内存没有特定的名字,而是通过指针来访问。 2. **内存来源**:动态内存是从堆(heap)中分配的,而静态内存通常来自栈(stack)。 3. **分配方式**:在 C++ 中,使用 `new` 操作符来分配动态内存,而不是声明变量的方式。 #### 内存区域简介 - **栈(Stack)**:用于存储函数调用时的局部变量、函数参数等,其生命周期与函数调用相关。 - **未初始化数据区**:存放未初始化的全局变量和静态变量。 - **已初始化数据区**:存放初始化后的全局变量和静态变量。 - **代码区**:存储程序的机器指令。 - **堆(Heap)**:动态分配内存的区域,可以由程序员控制分配与释放。 #### 动态内存分配示例 1. **分配单个整型变量**: ```cpp int *ptr; ptr = new int; ``` 这里 `ptr` 是指向动态分配的一个整数的指针。 2. **为指针赋值**: ```cpp *ptr = 12; ``` 此时,通过 `ptr` 指向的整数被赋值为 12。 3. **分配数组**: ```cpp ptr = new int[3]; ``` 这里 `ptr` 指向的是一个包含三个元素的整数数组。 4. **错误示例**: ```cpp ptr[1] = 7; ``` 如果在此之前没有为 `ptr` 分配足够的空间,则该操作可能导致未定义行为或程序崩溃。 5. **释放内存**: - 单个变量的释放: ```cpp delete ptr; ``` - 数组的释放: ```cpp delete[] ptr; ``` 当释放对象数组时,必须使用 `delete[]` 来确保每个对象的析构函数都被正确调用。 6. **对象数组释放问题**: ```cpp SomeObject* ptr = new SomeObject[3]; delete ptr; // 错误!只有 ptr[0] 的析构函数会被调用 delete[] ptr; // 正确!所有对象的析构函数都会被调用 ``` 对于类的对象数组,必须使用 `delete[]` 来确保每个对象的析构函数都被调用,从而避免资源泄露等问题。 #### 二维数组的动态分配 1. **声明指针**: ```cpp int** x; ``` 2. **分配行指针**: ```cpp x = new int*[2]; ``` 3. **为每行分配空间**: ```cpp x[0] = new int[2]; x[1] = new int[2]; ``` 这样就创建了一个 2x2 的二维数组。 #### 引用与指针 - **引用**:创建一个新的名字来表示同一个变量,常用于函数参数传递,以保留函数内部对参数所做的修改。 - **指针**:存储变量地址的变量,可用于动态内存管理。 - **传递方式对比**: - **按值传递**: ```cpp void swap(int a, int b) { int temp = a; a = b; b = temp; } ``` 此方法不会改变原始变量的值。 - **按指针传递**: ```cpp void swap(int* ptra, int* ptrb) { int temp = *ptra; *ptra = *ptrb; *ptrb = temp; } ``` 使用指针可以改变原始变量的值。 - **按引用传递**: ```cpp void swap(int& a, int& b) { int temp = a; a = b; b = temp; } ``` 使用引用也可以达到相同的效果,代码更简洁。 #### vector容器 - **优点**: - **动态大小**:`vector` 的大小可以根据需要动态扩展或缩小。 - **安全性**:提供了一些内置的安全检查机制,如越界检测等。 - **效率**:在大多数情况下,其插入和删除操作比普通数组更高效。 - **灵活性**:结合了静态和动态内存分配的优点,并提供了更多高级功能。 - **示例**: ```cpp vector<int> vInt(10); // 创建一个包含 10 个整数的 vector ``` 通过以上内容可以看出,动态内存分配是现代软件开发中不可或缺的一部分。合理地使用动态内存分配不仅可以提高程序的性能,还能有效减少内存泄漏等问题的发生,进而提升系统的稳定性和用户体验。
剩余27页未读,继续阅读
- 墨菲斯2012-03-27发现是英文的,并且讲解不怎么样
- 粉丝: 21
- 资源: 41
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于GJB 8896-2017 网格编码计算 java代码
- 可以与树莓派合体的FPGA开发板
- reqable-app-macos-x86-64-v2.27.2-x86-64.dmg
- 技术资料分享ADV7123非常好的技术资料.zip
- dq轴旋转坐标系下的永磁同步电机simulink基础模型
- 技术资料分享信利4.3单芯片TFT1N4633-Ev1.0非常好的技术资料.zip
- 使用 Flask 框架构建的 Web 应用程序,功能涉及用户认证、文件上传(CSV 和图像文件)、图像文字识别(OCR)
- 实验3选择结构.doc
- 第三章随堂代码(上).ipynb
- 基于云开发的微信答题小程序,软件架构是微信原生小程序+云开发 主要包含六大功能模块页面,首页、答题页、结果页、活动规则页、答题记