企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
#### 29. 动态内存 了解动态内存在 C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。C++ 程序中的内存分为两个部分: * \*\*栈:\*\*在函数内部声明的所有变量都将占用栈内存。 * \*\*堆:\*\*这是程序中未使用的内存,在程序运行时可用于动态分配内存。 很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。 在 C++ 中,您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。这种运算符即 **new** 运算符。 如果您不再需要动态分配的内存空间,可以使用 **delete** 运算符,删除之前由 new 运算符分配的内存。 **new 和 delete 运算符:** 下面是使用 new 运算符来为任意的数据类型动态分配内存的通用语法: ~~~ new data-type; 复制代码 ~~~ 在这里,**data-type** 可以是包括数组在内的任意内置的数据类型,也可以是包括类或结构在内的用户自定义的任何数据类型。让我们先来看下内置的数据类型。例如,我们可以定义一个指向 double 类型的指针,然后请求内存,该内存在执行时被分配。我们可以按照下面的语句使用 **new** 运算符来完成这点: ~~~ double* pvalue = NULL; // 初始化为 null 的指针 pvalue = new double; // 为变量请求内存 复制代码 ~~~ 如果自由存储区已被用完,可能无法成功分配内存。所以建议检查 new 运算符是否返回 NULL 指针,并采取以下适当的操作: ~~~ double* pvalue = NULL; if( !(pvalue = new double )) { cout << "Error: out of memory." <<endl; exit(1); } 复制代码 ~~~ **malloc()** 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。 在任何时候,当您觉得某个已经动态分配内存的变量不再需要使用时,您可以使用 delete 操作符释放它所占用的内存,如下所示: ~~~ delete pvalue; // 释放 pvalue 所指向的内存 复制代码 ~~~ 下面的实例中使用了上面的概念,演示了如何使用 new 和 delete 运算符: ~~~ void test26() { //演示如何使用 new 和 delete 运算符: //初始化为 null 的指针 double *pvalue = NULL; //为变量申请内存 pvalue = new double; //在分配的地址存储值 *pvalue = 1314.520; //打印存储的数字 cout << "pvalue 的地址值为:\t" << &pvalue << "\n在该地址存储的值为:\t" << *pvalue << endl; //释放内存 delete pvalue; //数组的动态内存分配 //动态分配,数组长度为 10 int *array = new int[10]; //释放数组内存 delete[] array; //对象的动态内存分配 Box *testBox = new Box[10]; delete[] testBox; } 复制代码 ~~~ > **输出:** > > pvalue 的地址值为: 0x7ffee8b27658 在该地址存储的值为: 1314.52 > > pvalue 的地址值为: 0x7ffee7b8c658 在该地址存储的值为: 1314.52 调用构造函数! 调用构造函数! 调用构造函数! 调用构造函数! 调用构造函数! 调用构造函数! 调用构造函数! 调用构造函数! 调用构造函数! 调用构造函数! 调用析构函数! 调用析构函数! 调用析构函数! 调用析构函数! 调用析构函数! 调用析构函数! 调用析构函数! 调用析构函数! 调用析构函数! 调用析构函数!