QA@IT

C++の勉強をしています。メモリ解放とは、現場でどのようなときに利用されていますか。

4961 PV

visual studio 2012を利用しています。visual C++でC++を勉強しています。基本的なところでメモリ解放というのがあるのですが。実際どのような場合に利用されているのでしょうか。C#でデスクトップアプリを作成するときは、そういった作業をすることがないので、イメージがわきません。よろしくお願いします。

  • これも掲示板で聞くような質問ではないと思いますが・・・ 一言だけ言うと、「C#でデスクトップアプリ」は .NET Framework 上で動くマネージコードなのでガベージコレクタがメモリの解放をしてくれるが、C++ で作るアンマネージコードはガベージコレクタが働かないので、プロ倉かの責任でメモリの解放を行わなければならないということです。 -
  • すみません、タイプミスがありました。誤:プロ倉か ⇒ 正:プログラマ -
  • ご回答ありがとうございます。しっかり調べてみます。 -

回答

普通のC++の話ですよね?

正確には「メモリの管理が他の言語より面倒を見ないといけない場面が多い」になるかと思います。
自動変数とか動的に確保しなかったクラスなどはC#同様勝手に開放されます。

ライブラリ(Boost他)を使ってオートポインタとかスマートポイントを使えば最近の言語と同じ様に自動解放の恩恵にもあずかることもできます。
(C++11からは標準ライブラリにスマートポインタが加わっています。VC++の場合C++/CLIという .NET寄りなC++だとそれはそれで話が違ってきます(gcnewなど)。)

そういったライブラリを使わない場合、自分で確保(new, malloc)したメモリは自分で責任をもって解放(delete, free)しなければいけません。たとえばC#でもいろいろnewしたりして確保はしますが、それらすべてをアプリケーションが終了するまでにdeleteという命令で解放しなければならなくなると思ってください。

それだけ聞くとそんなに難しく無いように思えるかもしれませんが、同じデータやインスタンス
を複数の箇所で利用していた場合、どのタイミングでなら解放していいのかという判断はなかなか難しいものですし、解放処理をどこに書けばいいのか、エラーが起きてもきちんと解放できるかなどを気にしなければいけません。

C#でもきちんとしたコードでないとメモリの解放漏れが起こります。
usingで開放できるような程度の物ならいいですが、画像処理なんかでは気をつけないと結構解放忘れが起こります(PictureBoxに表示中だと解放できないとかけっこう面倒なものもあったり)。なので自動的に開放してくれる言語であっても、dotPeekといったメモリ管理製品などが存在したりしますね。

話がそれましたが、CやC++では自分で動的に確保したメモリは自分で解放しなければいけません。また確保するにあたってもきちんと自分でどれくらい必要なのか判断して用意しないといけません。

スマートポインタなどの便利機能が使えるかどうかは現場の流儀だとか開発するものの制約(パソコンではなくもっと小さな機械では使えるメモリやパワーが足りなくてライブラリの使用を見送る場合もあります)などにも依ってくるでしょう。

編集 履歴 (2)
  • 親切丁寧に解説ありがごうございます。とても、わかりやすいです。

    -

SurferOnWwwさんが既に書かれていますが、C#などではプログラムに必要なメモリの確保及び使わなくなったメモリの開放を自動的に行います。

その仕組みのことを「ガベージコレクション」といいますので調べてみてください。

その確保と開放をC++では明示的にプログラマが行います。
ガベージコレクション自体の処理がない分、若干動作が軽くなりますが
最近のデバイスではその差は気になるレベルではないでしょう。

編集 履歴 (0)
  • ありがごうございます。ガベージコレクションについて調べてみます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。