メモリ管理 : 例

更新 : 2007 年 11 月

一般的なメモリ割り当てには次の 3 種類があります。ここでは、これらのデータに対して 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");
    

参照

概念

メモリ管理 : ヒープ割り当て