这篇博文,记录一下自己学习的关于C++动态内存的内容。
什么是动态内存?
当我学习一件东西的时候,一般最先想知道的是,这是什么东西。为了理解动态内存,我们先要知道C++内存相关的知识。
C/C++程序所占用的内存除了文字常量区(存放常量字符串)和程序代码区(存放函数体的二进制代码),主要是三个部分:
- 栈内存(stack) 由编译器自动分配释放,存放定义在函数内的非static对象。
- 静态内存 由编译器自动分配释放,保存局部static对象,类static数据成员以及定义在任何函数之外的变量。
- 堆内存,自由空间(heap) 保存动态分配的对象,必须显式的创建和销毁。(注:堆和自由空间并不全部对等,详情可以参考https://cloud.tencent.com/developer/article/1155154)
知道这些内容后,我们就知道了动态内存,就是由程序员从堆中根据需要申请的一块内存。随之而来的问题就是:为什么需要动态内存。
为什么需要动态内存?
我在《c++primer》上找到了答案,程序使用动态内存一般出于以下三个原因之一:
- 程序不知道自己需要使用多少对象
- 程序不知道所需对象的准确类型
- 程序需要在多个对象间共享数据(共享相同的状态)
对于第一种原因,很好的例子就是容器类。c++中原始数组,必须在声明的时候就给出数组的大小,很不灵活,动态数组就是实现随时添加元素并且不会造成资源的浪费。对于第三个原因,因为动态内存是由程序员分配释放,不会被编译器销毁,所以可以通过指向动态内存的指针在对象共享数据。
如何使用动态内存?
动态内存的使用,也就是new和delete的使用,这里就不详细介绍,但最重要的就是要记住几点
- 不要多次delete同一块内存
- 不要delete不是new分配的内存
- 记住在使用完动态内存后delete
- 不要使用指向被delete的内存的指针