/* (1)C++ 程序中的内存分为两个部分: 栈:在函数内部声明的所有变量都将占用栈内存。 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。 (2)new 和 delete 运算符 在 C++ 中可以使用特殊的运算符为给定类型的变量在"运行时"分配 "堆"内的内存,这会返回所分配的空间地址。这种运算符即"new"运算符。 如果不需要动态分配内存,可以使用"delete"运算符,删除之前由 new 运算符分配的内存。 使用 new 运算符来为任意的数据类型动态分配内存的通用语法: new data-type; data-type 可以是包括数组在内的任意内置的数据类型,也可以是包括类 或结构在内的用户自定义的任何数据类型。 eg: double* pvalue = NULL;//先定义一个指向 double 类型的指针 if( !(pvalue = new double ))//再使用new请求内存并检查是否返回NULL指针 { //自由存储区用完,无法成功分配内存 cout << "Error: out of memory." <<endl; exit(1); } delete pvalue; // 释放 pvalue 所指向的内存 备注:malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在, 但建议尽量不要使用 malloc() 函数。new 与 malloc() 函数相比, 其主要的优点是,new 不只是分配了内存,它还创建了对象。 */ /***********1-单个变量new与delete******************/ #include <iostream> using namespace std; int main1 () { double* pvalue = NULL; // 初始化为 null 的指针 pvalue = new double; // 为变量请求内存 *pvalue = 29494.99; // 在分配的地址存储值 cout << "Value of pvalue : " << *pvalue << endl; delete pvalue; // 释放内存 return 0; } /***********2-数组的动态内存分配******************/ int main2 () { /**************一维数组的动态内存分配****************/ // 动态分配,数组长度为 2 int *array=new int [2]; //释放内存 delete [] array; /**************二维数组的动态内存分配****************/ int **array2; // 假定数组第一维长度为 2, 第二维长度为 3 // 动态分配空间 array2 = new int *[2]; for( int i=0; i<2; i++ ) { array2[i] = new int [3] ; } //释放 for( int i=0; i<2; i++ ) { delete [] array2[i]; } delete [] array; return 0; } /***********3-对象的动态内存分配******************/ class Box { public: Box() { cout << "调用构造函数!" <<endl; } ~Box() { cout << "调用析构函数!" <<endl; } }; int main3( ) { Box* myBoxArray = new Box[4]; delete [] myBoxArray; // 删除数组 /* 如果要为一个包含四个 Box 对象的数组分配内存, 构造函数将被调用 4 次,同样地,当删除这些对象时, 析构函数也将被调用相同的次数(4次) */ return 0; } /*delete 与 delete[] 区别: delete ptr -- 代表用来释放内存,且只用来释放ptr指向的内存。 delete[] rg -- 用来释放rg指向的内存,还逐一调用数组中每个对象的 destructor. */ 备注:此为学习笔记,课程来源菜鸟教程。 </iostream>