C++ 动态内存【下】

55 阅读1分钟

数组的动态内存分配

假设我们要为一个字符数组(一个有 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; 
      }};int main( ){
   Box* myBoxArray = new Box[4];
​
   delete [] myBoxArray; // Delete array
​
   return 0;}

如果要为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。

当上面的代码被编译和执行时,它会产生下列结果:

调用构造函数!调用构造函数!调用构造函数!调用构造函数!调用析构函数!调用析构函数!调用析构函数!调用析构函数!

函数宏

您可以使用 #define 来定义一个带有参数的宏,如下所示:

#include <iostream>using namespace std;#define MIN(a,b) (a<b ? a : b)int main (){
   int i, j;
   i = 100;
   j = 30;
   cout <<"较小的值为:" << MIN(i, j) << endl;
​
    return 0;}

当上面的代码被编译和执行时,它会产生下列结果:

较小的值为:30

条件编译

有几个指令可以用来有选择地对部分程序源代码进行编译。这个过程被称为条件编译。

条件预处理器的结构与 if 选择结构很像。请看下面这段预处理器的代码:

#ifndef NULL   #define NULL 0#endif

您可以只在调试时进行编译,调试开关可以使用一个宏来实现,如下所示:

#ifdef DEBUG   cerr <<"Variable x = " << x << endl;#endif

如果在指令 #ifdef DEBUG 之前已经定义了符号常量 DEBUG,则会对程序中的 cerr 语句进行编译。您可以使用 #if 0 语句注释掉程序的一部分,如下所示:

#if 0   不进行编译的代码#endif

让我们尝试下面的实例:

#include <iostream>using namespace std;#define DEBUG#define MIN(a,b) (((a)<(b)) ? a : b)int main (){
   int i, j;
   i = 100;
   j = 30;#ifdef DEBUG
   cerr <<"Trace: Inside main function" << endl;#endif#if 0
   /* 这是注释部分 */
   cout << MKSTR(HELLO C++) << endl;#endif
​
   cout <<"The minimum is " << MIN(i, j) << endl;#ifdef DEBUG
   cerr <<"Trace: Coming out of main function" << endl;#endif
    return 0;}

当上面的代码被编译和执行时,它会产生下列结果:

Trace: Inside main functionThe minimum is 30Trace: Coming out of main function