C++におけるグローバルメモリ管理:スタックかヒープか?
C++におけるグローバルメモリ管理:スタックかヒープか?
C++プログラムの実行中、通常の変数は主に「スタック」と「ヒープ」という2つのメモリ領域に格納されます。スタック上に確保されたローカル変数は、関数の終了とともに自動的に破棄され、ヒープから動的に確保したメモリも、解放処理やプログラム終了のタイミングで回収されます。つまり、これらの領域にあるデータは、プログラムの実行ライフサイクルの中で生成・破棄を繰り返す性質を持っています。
しかし、グローバル変数やグローバルなデータ構造は、スタックにもヒープにも配置されません。これらはプログラムの起動時に固定されたメモリブロック(一般に「データセグメント」や「BSSセクション」と呼ばれる領域)へ割り当てられ、プログラムが終了するまでアドレスもサイズも変化することなく維持されます。
コード例
int a[10]; // 固定されたメモリブロック(データセグメント)に配置される
int main() {
float *ptr = (float *)malloc(sizeof(float) * 10); // ヒープを使用
free(ptr); // 使い終わったら解放
return 0;
}
各メモリ領域の特徴まとめ
- スタック:ローカル変数の格納用。スコープを抜けると自動的に破棄されるため管理が容易。
- ヒープ:malloc や new などで動的に確保。サイズを実行時に決められる一方、解放はプログラマの責任となる。
- グローバル領域:グローバル変数・静的変数専用。プログラムの開始から終了まで固定的に確保され続ける。
このように、C++では変数の宣言方法によって格納先のメモリ領域が異なり、それぞれ寿命(ライフタイム)も大きく変わります。グローバル変数はプログラム全体を通じて常に存在するため、大規模な配列などを安易にグローバルで定義すると、使用していない期間でもメモリを占有し続ける点には注意が必要です。
-
C++ STLのスタック(stack)徹底解説!LIFO構造の基本操作とサンプルコード
C++ STLにおけるスタック(stack)は、LIFO(Last In First Out:後入れ先出し)構造として実装されるコンテナです。LIFOとは「最後に入れたものが最初に取り出される」という意味で、本を一冊ずつ積み上げた山をイメージすると理解しやすいでしょう。一番上に置いた本(=最後に挿入された要素)が最初に取り出されることから、この構造はLIFOと呼ばれています。 スタックで使える主な操作 1. top() – 最上位要素の取得 スタックの最上位(先頭)にある要素への参照を返します。要素自体は削除されません。 構文:name_of_stack.top() 引数:なし 戻り値:ス
-
C++で学ぶ二項ヒープ(Binomial Heap)の基礎と操作
二項ヒープ(Binomial Heap)とは、二分ヒープ(Binary Heap)を拡張したデータ構造です。二分ヒープが提供する各種操作に加えて、より高速なマージ(union)操作を実現できる点が大きな特徴です。二項ヒープは、複数の二項木(Binomial Tree)のコレクションとして表現されます。二項木(Binomial Tree)とは?次数kの二項木は、次数k-1の二項木を2つ用意し、一方をもう一方の最左の子として連結することで構築できます。次数kの二項木には、以下のような性質があります。ノードの総数は正確に2k個である。木の深さはkである。深さi(i = 0, 1, ..., k)には