オブジェクトの解放について

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

オブジェクトの解放について

#1

投稿記事 by skn » 10年前

DirectX9のプログラムを触っていてふと疑問に思ったのですが、

DirectX9のプログラムではアプリケーションの終了時にLPDIRECT3DDEVICE9変数などを解放しますよね。
これは手元の本によるとメモリリークを防ぐためのものと書かれていますが、
調べてみると最近のOSならばアプリケーションごとにメモリが確保されていて、アプリケーションが終了した時点でそのメモリは全て自動で解放されるという情報も見られました。

ということは、今は上記のLPDIRECT3DDEVICE9変数のような、アプリケーションの終了時にしか解放のタイミングが考えられないようなオブジェクトはわざわざ解放処理を書かなくても問題ないのでしょうか?

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: オブジェクトの解放について

#2

投稿記事 by YuO » 10年前

skn さんが書きました:DirectX9のプログラムではアプリケーションの終了時にLPDIRECT3DDEVICE9変数などを解放しますよね。
これは手元の本によるとメモリリークを防ぐためのものと書かれていますが、
調べてみると最近のOSならばアプリケーションごとにメモリが確保されていて、アプリケーションが終了した時点でそのメモリは全て自動で解放されるという情報も見られました。
ということは、今は上記のLPDIRECT3DDEVICE9変数のような、アプリケーションの終了時にしか解放のタイミングが考えられないようなオブジェクトはわざわざ解放処理を書かなくても問題ないのでしょうか?
オブジェクトの解放で解放されるのはメモリだけではありません。
各種の共有資源へのアクセス権も解放されます。
また,解放処理の際に終了処理が行われる可能性があります。

その上で個々のオブジェクトについて書くならば,ローカルのグラフィクスデバイスであれば,おそらく正しく解放されているのと同じ状況が作り出されると思います。
オフトピック
バグその他により不正終了した場合に,デバイスを確保し続けては大きな問題になるため
ただし,それ以外のオブジェクトは,例えば
  • 独自のバッファを持ったファイルオブジェクトに書き込んだデータが正しく出力されない
  • ネットワーク上のプロトコルで,正規の終了が通知されないためにタイムアウトまで無意味にサーバーリソースを確保し続ける
などが起きる可能性があります。
このため,すべてのオブジェクトを終了時には正しく解放する,というのが間違いない方法となります。
オフトピック
このオブジェクトは終了処理があるから解放が必要,このオブジェクトはないから不要,というような,場合によっては実装に依存してしまうような調査が不要になるため
例外安全から語られることの多いRAIIは,この目的にも利用可能な技術です。

skn

Re: オブジェクトの解放について

#3

投稿記事 by skn » 10年前

なるほど、ではやはりしっかり全て解放処理を行っておくのが安全なのですね。
ありがとうございました!

閉鎖

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