Поделиться через


Управление памятью: примеры

В этой статье описывается, как 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");
    

См. также

Управление памятью: выделение кучи