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

こんにちは!
キミヒラです。

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

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

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

目次

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

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

スタック領域

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

ヒープ領域

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

実装時の注意

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次