内存管理:示例

本文介绍 MFC 如何分别为这三种典型内存分配执行帧分配和堆分配:

分配字节数组

在帧上分配字节数组

  1. 定义数组,如下面的代码所示。 当数组变量退出其作用域时,将自动删除该数组并回收其内存。

    {
    const int BUFF_SIZE = 128;
    
    // Allocate on the frame
    char myCharArray[BUFF_SIZE];
    int myIntArray[BUFF_SIZE];
    // Reclaimed when exiting scope 
    }
    

在堆上分配字节数组(或任何基元数据类型)

  1. new 运算符与此示例中显示的数组语法结合使用:

    const int BUFF_SIZE = 128;
    
    // Allocate on the heap
    char* myCharArray = new char[BUFF_SIZE];
    int* myIntArray = new int[BUFF_SIZE];
    

从堆中释放数组

  1. 按如下所示使用 delete 运算符:

    delete[] myCharArray;
    delete[] myIntArray;
    

分配数据结构

在帧上分配数据结构

  1. 按如下所示定义结构变量:

    struct MyStructType { int topScore; };
    void MyFunc()
    {
       // Frame allocation
       MyStructType myStruct;
    
       // Use the struct 
       myStruct.topScore = 297;
    
       // Reclaimed when exiting scope
    }
    

    当结构退出其作用域时,将回收该结构占用的内存。

在堆上分配数据结构

  1. 使用 new 在堆上分配数据结构,使用 delete 释放它们,如以下示例所示:

    // Heap allocation
    MyStructType* myStruct = new MyStructType;
    
    // Use the struct through the pointer ...
    myStruct->topScore = 297;
    
    delete myStruct;
    

分配对象

在帧上分配对象

  1. 按如下所示声明对象:

    {
    CMyClass myClass;     // Automatic constructor call here
    
    myClass.SomeMemberFunction();     // Use the object
    }
    

    当对象退出其作用域时,将自动调用该对象的析构函数。

在堆上分配对象

  1. 使用 new 运算符(该运算符将返回指向对象的指针)在堆上分配对象。 使用 delete 运算符删除它们。

    以下堆和帧示例假定 CPerson 构造函数不采用任何参数。

    // Automatic constructor call here
    CMyClass* myClass = new CMyClass;
    
    myClass->SomeMemberFunction();  // Use the object
    
    delete myClass;  // Destructor invoked during delete
    

    如果 CPerson 构造函数的参数是指向 char 的指针,则帧分配的语句如下:

    CMyClass myClass("Joe Smith");
    

    堆分配的语句如下:

    CMyClass* myClass = new CMyClass("Joe Smith");
    

另请参阅

内存管理:堆分配