メモリ管理 : 例
一般的なメモリ割り当てには次の 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");