Udostępnij przez


Zarządzanie pamięcią: przykłady

W tym artykule opisano, jak MFC wykonuje alokacje ramek i alokacje sterty dla trzech typowych rodzajów alokacji pamięci.

Alokacja tablicy bajtów

Aby przydzielić tablicę bajtów w ramce

  1. Zdefiniuj tablicę, jak pokazano w poniższym kodzie. Tablica zostanie automatycznie usunięta, a jej pamięć zostanie odzyskana, gdy zmienna tablicowa zakończy jego zakres.

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

Aby przydzielić tablicę bajtów (lub dowolny typ danych pierwotnych) na stercie

  1. new Użyj operatora z składnią tablicy pokazaną w tym przykładzie:

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

Aby zwolnić pamięć tablic ze stosu

  1. delete Użyj operatora w następujący sposób:

    delete[] myCharArray;
    delete[] myIntArray;
    

Alokacja struktury danych

Aby przydzielić strukturę danych na ramce

  1. Zdefiniuj zmienną struktury w następujący sposób:

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

    Pamięć zajmowana przez strukturę zostaje odzyskana, gdy wychodzi z zakresu.

Aby alokować struktury danych na stercie

  1. Użyj new do przydzielenia struktur danych na stercie i delete do ich zwolnienia, jak pokazano w poniższych przykładach.

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

Alokacja obiektu

Aby przydzielić obiekt na ramce

  1. Zadeklaruj obiekt w następujący sposób:

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

    Destruktor obiektu jest automatycznie wywoływany, gdy obiekt kończy jego zakres.

Aby przydzielić obiekt na stercie

  1. Użyj operatora new, który zwraca wskaźnik do obiektu, aby przydzielić obiekty na stercie. Użyj operatora delete, aby je usunąć.

    W poniższych przykładach stosu i ramki przyjęto założenie, że CPerson konstruktor nie przyjmuje żadnych argumentów.

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

    Jeśli argumentem konstruktora CPerson jest wskaźnik do char, instrukcja alokacji ramek to:

    CMyClass myClass("Joe Smith");
    

    Wyrażenie alokacji sterty to:

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

Zobacz także

Zarządzanie pamięcią: alokacja sterty