ページ 11

新プログラミングの館のメニュー画面の作り方(C++編)について

Posted: 2013年2月01日(金) 12:20
by datto
初めて質問させていただきます。
いつもここを参考にさせていただいているのですが、今回メニュ画面の作り方(C++編)のソースコードに疑問があり、投稿しました。
SceneMgr.cppのソースコードでは、newによりmSceneの中身を確保していますが、deleteしているのはSceneMgr::Update()内のif条件文の中だけです。
mSceneを作り直すときはいいのですが、SceneMgr自体が破棄されるプログラム終了時にもdeleteが必要となってくるのでは、と思いました。
プログラム自体はこのままで問題なく動いているようなのですが・・・
自分のC++関する知識がまだ少ないのでよくわからず、より良識のある人の意見を聞きたく思い失礼ながら質問をさせていただきました。どなたでもかまいませんので、ご回答の程よろしくお願いします。

Re: 新プログラミングの館のメニュー画面の作り方(C++編)について

Posted: 2013年2月01日(金) 12:37
by h2so5
deleteしたほうがコードとしては安全だと思います。

現在のコードでは無くても動作しますが、シーンクラスのデストラクタで何らかの処理(I/Oなど)を実装した場合に問題が起きる可能性はあります。
(そういう処理はデストラクタで実装しないほうが良いとは思いますが。)

ただし、そこまで考えるならdeleteを使わずstd::unique_ptrなどのスマートポインタを使うのがベストでしょうね。

Re: 新プログラミングの館のメニュー画面の作り方(C++編)について

Posted: 2013年2月01日(金) 13:20
by datto
素早い回答を有難うございます。
なるほど、スマートポインタですか。ググッてきました。
確かにこちらを使うのが安全そうです。

いまいちまだよくわかっていないのですが、今のままのコードでも問題が起こらないのはどうしてなのでしょうか?
なんだか非常に初歩的なことを質問しているかもしれませんが、すみません。

Re: 新プログラミングの館のメニュー画面の作り方(C++編)について

Posted: 2013年2月01日(金) 13:51
by h2so5
datto さんが書きました:いまいちまだよくわかっていないのですが、今のままのコードでも問題が起こらないのはどうしてなのでしょうか?
なんだか非常に初歩的なことを質問しているかもしれませんが、すみません。
newで確保したメモリ領域をdeleteしない場合でもメモリリークが起きるだけで、メモリを食い潰さないかぎりプログラムの動作に支障はありません。

シーン切替時にdeleteしないとメモリの使用量が増えていってしまいますが、プログラム終了時にはdeleteしなくてもプロセスが使用していたヒープ領域はOSによって自動的に解放されるので、メモリリークは起きないということになります。

ただしdeleteしない場合はデストラクタが呼ばれません。
また、長時間連続して動作させるプログラムや頻繁にnewを使用するプログラムではメモリリークが問題になりやすいということになります。

Re: 新プログラミングの館のメニュー画面の作り方(C++編)について

Posted: 2013年2月01日(金) 14:07
by datto
丁寧な説明を有難うございました。
考えてみたらプログラムが終了してるんだから、メモリリークのことは気にする必要ないですよね。
くだらない質問をしてすいません。
スマートポインタ、とっても便利そうです。使っていこうと思います。