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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
trephia

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

#1

投稿記事 by trephia » 13年前

初めまして、お聞きしたい事があり質問します。

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 13年前

deleteしてない場合はクラスのデストラクタが呼び出されていないので状況によっては資源解放漏れやら書きだされていないデータが発生するかも知れません。

【補足】
例えばWindowsで漏れる資源解放というとタスクトレイ(通知領域)のアイコンは解放通知しないと自動では消えてくれません。
※ マウスカーソルを持って行くと消えてくれますが、それまでは表示されたアンデット状態です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

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

#3

投稿記事 by beatle » 13年前

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

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

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

#4

投稿記事 by ISLe » 13年前

C/C++のランタイムがネイティブなリソースの解放までしてくれるのでしょうか。

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

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

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

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

trephia

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

#5

投稿記事 by trephia » 13年前

色々回答ありがとうございます。

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

たかぎ
記事: 328
登録日時: 14年前
住所: 大阪
連絡を取る:

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

#6

投稿記事 by たかぎ » 13年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る