ページ 11

newした領域へのdeleteの必要性

Posted: 2012年9月20日(木) 17:24
by trephia
初めまして、お聞きしたい事があり質問します。

newで確保した領域をdeleteしないままだったとしても、
最近のWindowsなど一般的な環境であればプログラムの終了時に解放してくれます。
これが例えばゲームでの敵クラスのように何度も確保と解放を繰り返すようなものなら
起動している限りどんどん使用メモリが増えてしまうので問題でしょうが、
では、プログラム起動中に一度だけ確保と解放を行うような領域であれば
特にプログラム終了直前のdeleteなどせずにそのまま終了させても問題が無いように思います。

このようなプログラムにより何らかの問題が発生することはありますか。

作法として良いか悪いかではなく、実害があるかどうかでお願いします。
また後からプログラムを修正する事や、他の環境への移植などは考えないものとします。

Re: newした領域へのdeleteの必要性

Posted: 2012年9月20日(木) 17:45
by softya(ソフト屋)
deleteしてない場合はクラスのデストラクタが呼び出されていないので状況によっては資源解放漏れやら書きだされていないデータが発生するかも知れません。

【補足】
例えばWindowsで漏れる資源解放というとタスクトレイ(通知領域)のアイコンは解放通知しないと自動では消えてくれません。
※ マウスカーソルを持って行くと消えてくれますが、それまでは表示されたアンデット状態です。

Re: newした領域へのdeleteの必要性

Posted: 2012年9月20日(木) 21:18
by beatle
本の虫: C++11ですみやかにプログラムの実行を終了する方法
に紹介されていますが,C++11では std::quick_exit 関数が追加されました.
これはもろに,OSにリソース開放処理を任せ,プログラムではリソースを解放せずにプログラムを終了するための関数です.
こんな関数が標準関数になるくらいですから,しっかりしたOS上ならば,純粋なメモリリソースの解放はOSに任せても実害はない,ということです.
もちろんsoftyaさんが仰るように,メモリ以外の資源の解放は行われないかもしれません.

Re: newした領域へのdeleteの必要性

Posted: 2012年9月21日(金) 00:04
by ISLe
C/C++のランタイムがネイティブなリソースの解放までしてくれるのでしょうか。

std::quick_exitって使用しているすべての既存クラスがデストラクタでリソースをフラッシュしないことを把握しないと使えないのでは?
例えばネットワークのポートを解放してはくれても、通信先と中断のネゴシエーションはしてくれないですよね。
クラスによる隠蔽化を真っ向から否定する仕組みのような気がします。

CRTヒープしか使っていないアプリならかまわないと思います。
わたしもC/C++の標準ライブラリしか使わないmain関数だけで完結するようなテストコードでdelete書かないこともあります。

個人的には書くのか書かないのか考えるのが面倒くさいですし、それなりの規模のプログラムになると初期化と解放がセットになったモジュールで組み立てて終了直前のコードに手を加えるようなことはしないので、意識しないとむしろ解放処理を書いてしまいます。

PCの動作に対しての実害は無いですが、変なところでdeleteを書かない癖が付くと人生に実害が及ぶ可能性があるような気がします。

Re: newした領域へのdeleteの必要性

Posted: 2012年9月21日(金) 18:51
by trephia
色々回答ありがとうございます。

確かにデストラクタが呼ばれない事による問題などはあるかもしれませんね。
参考にします。ありがとうございました。

Re: newした領域へのdeleteの必要性

Posted: 2012年9月21日(金) 21:27
by たかぎ
単に早く終わらせたいだけなら、std::quick_exitよりstd::_Exitの方がよいのでは?
デストラクタ云々を言い出すのであれば、std::exitでも自動オブジェクトとかのデストラクタは呼ばれないので五十歩百歩です。