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 操作符的通用语法,可以为多维数组分配内存,如下所示:

  1. int ROW = 2;
  2. int COL = 3;
  3. double **pvalue = new double* [ROW]; // 为行分配内存
  4. // 为列分配内存
  5. for(int i = 0; i < COL; i++) {
  6. pvalue[i] = new double[COL];
  7. }

释放多维数组内存:
for``(``int`` i ``=`` ``0``;`` i ``<`` COL``;`` i``++)`` ``{
``delete``[]`` pvalue``[``i``];
}
delete`` ``[]`` pvalue``;

对象的动态内存分配

定义类的动态对象数组时,系统会自动调用该类的无参构造函数对其初始化
对象与简单的数据类型没有什么不同。例如,请看下面的代码,我们将使用一个对象数组来理清这一概念:

  1. #include <iostream>
  2. using namespace std;
  3. class Box
  4. {
  5. public:
  6. Box() {
  7. cout << "调用构造函数!" <<endl;
  8. }
  9. ~Box() {
  10. cout << "调用析构函数!" <<endl;
  11. }
  12. void B(){}
  13. };
  14. int main( )
  15. {
  16. Box* myBoxArray = new Box[4];
  17. delete [] myBoxArray; // Delete array
  18. return 0;
  19. }

如果要为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。
对象数组某个元素加上下标中括号就可以调用成员(本来类型就是对象嘛)比如**myBoxArray[1].B();**
当上面的代码被编译和执行时,它会产生下列结果:
调用构造函数!
调用构造函数!
调用构造函数!
调用构造函数!
调用析构函数!
调用析构函数!
调用析构函数!
调用析构函数!