メモリ管理 : 例
この記事では、MFC がフレーム割り当てとヒープ割り当てを実行する方法を、次の 3 つの一般的なメモリ割り当てそれぞれについて説明します。
バイト配列の割り当て
フレーム上でバイト配列を割り当てるには
次のコードに示すように、配列を定義します。 配列変数がスコープを終了すると、配列は自動的に削除され、そのメモリが解放されます。
{ 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");