C++

C++のメモリ管理【ヒープ領域とスタック領域】

投稿日:2016年8月25日 更新日:

こんにちは!
DENです。

JavaやPHPを使っているとメモリの管理ってあまり意識しないと思います。

ですが、C++ではそうはいきません。
しっかりと理解して実装しないと、予期せぬ不具合を生んだり、メモリリークを起こしてしまうかもしれません。

普段メモリ管理を意識しない言語を使っているプログラマー向けに、C++のメモリ管理について初歩的な解説になります。

スポンサーリンク

メモリの割当て領域で扱いが変わる

C++において、データは宣言の仕方によって2種類のメモリ領域に割り当てられます。
それが、スタック領域ヒープ領域です。
Javaにもこの領域はありますが、GCが管理してくれているのであまり意識することはないですよね。

スタック領域

C++では、new以外で宣言したデータがスタック領域に格納されます。
スタック領域に格納されたデータは、その変数がスコープを抜けると自動的にメモリが開放されます。

ヒープ領域

C++では、newで宣言されたデータがヒープ領域に格納されます。
ヒープ領域に格納されたデータは自動でメモリが開放されません。
スコープがはずれても、メモリに残り続けるのでプログラマが明示的にdelete演算子で開放してあげる必要があります。

実装時の注意

上記を踏まえて、実装の時に何を意識したら良いのか。

newで生成したデータは初期化すること

newで生成したデータは、メモリに残り続けるのでちゃんと初期化してあげましょう。
メモリリークの原因になります。

メモリの開放はdelete関数で。

逆に、newで宣言していないデータは、使わなくなったら勝手にメモリから開放されるので何も気にしなくてOK。

特に理由がない限りは、newは使わないようにしましょう。

ポインタ変数を関数の戻り値にしない

関数内で生成したスタック領域のデータは、スコープを出た時にメモリから開放されます。

という事は、関数内で生成したデータのポインタを戻り値で返しても、上ルーチンでは参照出来ません。
正確には、ポインタの参照先にどんなデータが格納されているかわからない、という事になります。

もちろん、intなどの値型の変数は戻り値にしても大丈夫ですが。

対策方法は下記の記事が参考になるので、貼っておきます。

スタックに確保した変数の有効範囲に気をつける

まとめ:スタック領域とヒープ領域の違いを意識する

JavaやPHPのエンジニアだったら殆ど意識することないですよね。
ただ理解してしまえば難しい事はありません。

最後までお読みいただきありがとうございました!

スポンサーリンク


-C++

執筆者:

関連記事

no image

【C++】なにも代入していないクラス変数に値が入っている理由

こんにちは、C++の案件を年に1度だけ対応するプログラマーDENです。 今回は変数の初期化について。 Javaプログラマーの僕がなんで?って思った事について調べてみました。 スポンサーリンク 目次変数 …

【C++】浮動小数点数の誤差(double→floatで値が変わる)

C++で下記の2つのメソッドに3.6fを引数に渡すと異なる結果になります。

test1は35を返し、test2は36を返します。 3. …

プロフィール

このサイトを運営しているDENです。
アングラーのフリープログラマー。 主にプログラミングと釣の話を発信しています。
プログラミングで自由になり思う存分に釣りをしまくる生活実践中。
詳しいプロフィールはこちら 
フォスターフリーランス