次の方法で共有


メモリ管理 : フレーム割り当て

更新 : 2007 年 11 月

フレーム割り当てという名称は、関数が呼び出されるときに必ず設定される "スタック フレーム" に由来しています。スタック フレームとは、関数の引数および関数内でローカルに定義された変数を一時的に記憶するためのメモリ領域のことです。フレーム領域はコンパイラによって自動的に割り当てられるので、フレーム変数は "自動" 変数とも呼ばれます。

フレーム割り当てには 2 つの特徴があります。第 1 の特徴は、ローカル変数が定義されたときに、その変数全体を記憶するのに十分な大きさの記憶領域がスタック フレームに割り当てられることです。これは、変数が大きな配列またはデータ構造体であるときにも変わりません。第 2 の特徴は、フレーム変数はスコープ外に出たときに自動的に削除されることです。

void MyFunction()
{
    // Local object created on the stack
    CString strName;
    // Object goes out of scope and is deleted as function ends
}

関数のローカル変数では、関数が終了したときにスコープが変化しますが、入れ子になった中かっこが使われるときは、フレーム変数のスコープが関数より狭くなります (グローバル変数のときは広くなります)。フレーム変数のこのような自動的な削除機能は重要です。int や byte などの単純で基本的なデータ型、配列、データ構造体では、自動的に削除されると、変数が使っていたメモリがクリアされます。このとき変数はスコープ外に出ているので、アクセスできません。C++ オブジェクトを自動的に削除するプロセスは、これより複雑です。

オブジェクトをフレーム変数として定義すると、定義が記述されている位置で自動的にコンストラクタが呼び出されます。また、オブジェクトがスコープ外に出ると、そのオブジェクトのメモリがクリアされる前にデストラクタが自動的に呼び出されます。このコンストラクタとデストラクタの自動起動機構は便利ですが、これらの関数 (特にデストラクタ) が自動的に呼び出されることを常に意識しておく必要があります。

オブジェクトをフレームに割り当てる最大の利点は、オブジェクトが自動的に削除されることです。オブジェクトをフレームに割り当てると、削除し忘れたオブジェクトがメモリ リークを起こす心配がありません。メモリ リークの詳細については、「MFC でのメモリ リークの検出」を参照してください。一方、フレーム割り当ての問題点は、フレーム変数をそのスコープ外で使えないことです。フレーム割り当てとヒープ割り当てを使い分けるためのもう 1 つの判断基準として、大きな構造体およびオブジェクトではスタックよりもヒープの方が使いやすいという点が挙げられます。通常、スタック領域はあまり広くありません。

参照

概念

メモリ管理