C++

C++のメモリ管理について

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

こんにちは!
こへいんです。

僕は毎年この時期になると、C++のソフトウェアの改修案件が入ってきます。

普段は、JavaやPHPで開発していて、この時期だけC++を触るのですが、久しぶりに触ると初歩的な事を忘れていたりするんですよね。

毎回忘れちゃうのがメモリ管理!
メモリの開放ってどのケースだと必要なんだっけ?って毎年なるんですよ。

なので来年の僕の為にもわかりやすいメモを書いておきます。

スポンサーリンク

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

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

スタック領域

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

ヒープ領域

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

実装時の注意

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

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

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

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

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

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

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

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

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

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

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

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

まとめ

久しぶりに、C++などを触るとややこしいなあと思いますね。

でも、逆にプログラマなんだからメモリの仕組みくらいわかっていなと…
という危機感も感じます。

なので、年に1回のC++案件は、プログラマとして基礎を振り返る為にもこれからも勉強だと思って頑張っていこうかと思います。笑

スポンサーリンク


-C++

執筆者:

関連記事

no image

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

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

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

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

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

フォスターフリーランス
プロフィール

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