C++ 程序中的内存分为两个部分:
- 栈:在函数内部声明的所有变量都将占用栈内存。
- 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。
在 C++ 中,您可以使用new运算符为给定类型的变量在运行时分配堆内的内存,new会返回所分配的空间地址。
如果您不需要动态分配内存,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。
new语法:new用于初始化时 **=new 类型;**
比如double* pvalue = NULL; // 初始化为 null 的指针pvalue = new double; // 为变量请求内存
如果自由存储区已被用完,可能无法成功分配内存。所以建议检查 new 运算符是否返回 NULL 指针
检查是否返回NULL指针方法:double``*`` pvalue ``=`` NULL``;if``(`` ``!(``pvalue ``=`` ``new`` ``double`` ``))//如果内存不足,new操作返回空指针,空取反为1,执行cout:内存不足{cout ``<<`` ``"Error: out of memory."`` ``<<``endl``;``exit``(``1);//exit(1);可以提前中断整个程序}
new会自动调用无参构造函数
c语言中有类似new的函数malloc(),但是**new 不只是分配了内存,它还创建了对象**。所以推荐用new
delete释放内存delete pvalue; // 释放 pvalue 所指向的内存
delete经常被用于析构函数中,但这并非必须的
数组的动态内存分配
假设我们要为一个字符数组(一个有 20 个字符的字符串)分配内存,我们可以使用上面实例中的语法来为数组动态地分配内存,如下所示:char* pvalue = NULL; // 初始化为 null 的指针pvalue = new char[20]; // 为变量请求内存
以上即指针形式的字符数组
要删除我们刚才创建的数组,语句如下:delete [] pvalue; // 删除 pvalue 所指向的数组
下面是 new 操作符的通用语法,可以为多维数组分配内存,如下所示:
int ROW = 2;int COL = 3;double **pvalue = new double* [ROW]; // 为行分配内存// 为列分配内存for(int i = 0; i < COL; i++) {pvalue[i] = new double[COL];}
释放多维数组内存:for``(``int`` i ``=`` ``0``;`` i ``<`` COL``;`` i``++)`` ``{``delete``[]`` pvalue``[``i``];}delete`` ``[]`` pvalue``;
对象的动态内存分配
定义类的动态对象数组时,系统会自动调用该类的无参构造函数对其初始化
对象与简单的数据类型没有什么不同。例如,请看下面的代码,我们将使用一个对象数组来理清这一概念:
#include <iostream>using namespace std;class Box{public:Box() {cout << "调用构造函数!" <<endl;}~Box() {cout << "调用析构函数!" <<endl;}void B(){}};int main( ){Box* myBoxArray = new Box[4];delete [] myBoxArray; // Delete arrayreturn 0;}
如果要为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。
对象数组某个元素加上下标中括号就可以调用成员(本来类型就是对象嘛)比如**myBoxArray[1].B();**
当上面的代码被编译和执行时,它会产生下列结果:
调用构造函数!
调用构造函数!
调用构造函数!
调用构造函数!
调用析构函数!
调用析构函数!
调用析构函数!
调用析构函数!
