最近ゲームを作っていく上で、作ったデータを自分の手で、必要なタイミングで開放しなければならないという処理が出てきました。
作ったものを開放しないとメモリリークが起きる。これはわかるのですが、開放という概念がない段階でも、
当然のことながら変数などを定義し、データを作っています。それらは定義したブロックの外に出ると自動で開放されると思います。
そこで疑問なのが、自分の手で開放しなければならないデータと機械が勝手に開放してくれるデータの違いとは一体何なのでしょうか?
自分で開放しなければならないものとは?
自分で開放しなければならないものとは?
Done is better than perfect.(Mark Elliot Zuckerberg)
Re: 自分で開放しなければならないものとは?
メモリの「開放」ではなく「解放」が正しい使い方です。
基本的に malloc や new で動的確保したメモリ領域は、
スマートポインタやGCの管理下になければ手動で解放する必要があります。
それ以外の、画像データやソケットなどAPI経由で作成されたリソースを手動で解放すべきかどうかは、
APIのリファレンスに書かれているはずです。
基本的に malloc や new で動的確保したメモリ領域は、
スマートポインタやGCの管理下になければ手動で解放する必要があります。
それ以外の、画像データやソケットなどAPI経由で作成されたリソースを手動で解放すべきかどうかは、
APIのリファレンスに書かれているはずです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 自分で開放しなければならないものとは?
特別な解放の仕掛けなしに、自分で動的(mallocやnew)にメモリを確保しているか、内部で動的にメモリを確保している可能性があるライブラリを利用している場合は解放する必要があります。
画像、モデル、音楽などロードするものは基本的に解放する必要があると思ってください。あとハンドルがあるものも大抵は解放を必要とします。
ただし、プログラム終了まで確保しっぱなしで良いのならDXライブラリ関係なら終了時に自動で解放されますし、Win32APIやC言語の標準関数でも解放されるものもあります。
画像、モデル、音楽などロードするものは基本的に解放する必要があると思ってください。あとハンドルがあるものも大抵は解放を必要とします。
ただし、プログラム終了まで確保しっぱなしで良いのならDXライブラリ関係なら終了時に自動で解放されますし、Win32APIやC言語の標準関数でも解放されるものもあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 自分で開放しなければならないものとは?
>>h2so5さん、softyaさん
ありがとうございました。なんとなくですがわかりました。
ありがとうございました。なんとなくですがわかりました。
Done is better than perfect.(Mark Elliot Zuckerberg)