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

普段JavaやPHPを使ってメモリ管理を意識することがないのですが、C++ではそうはいきませんね。

メモリ管理が原因で不具合を生んだり、メモリリークを起こしてしまうかもしれません。

他言語のプログラマーがC++での開発を行う時に意識すべきメモリ管理について解説します。

目次

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

C++ではデータは宣言の仕方によって2種類のメモリ領域に割り当てられます。

それが、スタック領域ヒープ領域です。

Javaにもこの領域はありますが、GCが管理してくれているのであまり意識することはないですよね。

スタック領域

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

ヒープ領域

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

実装時の注意

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

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

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

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

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

特に理由がない限りは、newは使わないようすると良いかもしれません。

キミヒラ

僕はJavaに慣れているので積極的にnewを使っていましたが良くなかったですね。

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

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

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

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

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

あわせて読みたい
スタックに確保した変数の有効範囲に気をつける C++にはスタックとヒープという、使い方の違うメモリ領域が存在します。 rubyとかjavaではこのような違いは基本的に意識する必要が無いため

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

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

少しでも参考になれば幸いです。

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

おすすめ記事

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