C でのメモリ管理 : スタックとヒープ
Java や C# などのマネージド プログラミング言語に慣れている人向けの、手動メモリの概念C での管理は気が遠くなることがあります。スタックとヒープのメモリ割り当てのニュアンスを理解することは、リソースを効率的に利用するために非常に重要です。
一般的な考えに反して、スタックとヒープの割り当ての主な違いはパフォーマンスではなく、保存されたデータの寿命にあります。
スタックメモリ
関数スコープ内で宣言された変数 (つまり、 malloc() または new) を使用して割り当てられていないものはすべてスタック上に存在します。これらは関数が返されると自動的に削除されます。これは、特定の関数内で頻繁にアクセスされ、スコープがその関数に制限されている変数に最適です。
ヒープ メモリ
ヒープは、存続期間を超える必要があるデータに優先されます。それを作成した関数。これには、オブジェクト、使用頻度の低い変数、大規模なデータ構造が含まれます。ヒープ メモリは new を使用して割り当てられ、delete を使用して解放されます。アプリケーションは、ヒープに割り当てられたデータの有効期間を管理する責任があり、不適切に処理するとメモリ リークやクラッシュが発生する可能性があります。
現実世界のたとえ
説明するにはスタックとヒープの違い、これを考慮してください例え:
このコンテキストでは、アイテムをカウンターに積み重ねる (スタック メモリ) とすぐに使用するのに便利ですが、パントリーにアイテムをストックする (ヒープ メモリ) と、現在のタスクを超えた可用性が確保されます。
例
class Thingy; Thingy* foo() { int a; // lives on the stack Thingy B; // lives on the stack, deleted when foo() returns Thingy* pointerToB = &B; // points to an address on the stack Thingy* pointerToC = new Thingy(); // Thingy allocated on heap // Safe return: Thingy lives on heap and outlives foo() return pointerToC; // NOT SAFE: Thingy lives on stack and will be deleted when foo() returns return pointerToB; }
スタックとヒープの複雑さを理解することによってC では、プログラマはメモリ管理を最適化し、不適切なリソース処理に関連する潜在的な落とし穴を回避できます。
以上がC におけるスタックとヒープ: いつどちらを使用すべきですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。