内存管理:示例

本文介绍 MFC 如何执行帧分配和堆分配这三个典型的每个的内存分配:

  • 字节

  • 数据结构

  • 一个对象。

分配的字节

分配到框架中字节

  • 定义数组如下面的代码所示。 数组将被删除,但其内存自动还原,当数组变量退出其范围。

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

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

  • 使用在此示例中演示的数组语法的 new 运算符:

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

释放从堆的数组

  • 使用 delete 运算符如下所示:

    delete [] myCharArray;
    delete [] myIntArray;
    

数据结构的分配

分配到框架中一个数据结构

  • 定义结构变量如下所示:

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

    ,当退出其范围时,结构占用的内存还原。

分配堆中的数据结构

  • 使用 new 分配在堆和 delete 的数据结构释放它们,如显示按以下示例:

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

对象的分配

分配在框架的对象

  • 声明对象如下所示:

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

    对象时,退出其范围时,对象的析构函数自动调用。

分配堆中的对象

  • 使用 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");
    

请参见

概念

内存管理:堆分配