アプリ版:「スタンプのみでお礼する」機能のリリースについて

C#について質問なのですが、たとえば
System.Drawing.GraphicsクラスはメンバのDisposeメソッドを呼び出せば開放できるんですよね。
じゃあSystem.Int32などの構造体ってどうやって開放(破棄)するんですか??教えてください!

A 回答 (2件)

>new演算子で確保したメモリの開放はできるんですよね?



newはインスタンスを新しく作るときは何でも使いますから、newを使っているかどうかというよりは、
そのときに作ったインスタンスの種類によって場合分けして考えたほうがいいです。

・構造体=値型のインスタンス=メモリにはそもそも入らない。スタックに入る。
・通常のクラスや配列=参照型のインスタンス=managedリソースのヒープに入る。参照が消えれば、ガベージになり、そのうちガベージコレクタ(GC)で掃除される。
・System.Drawing以下やSystem.IO以下にあるクラスはunmanagedリソースを使っている可能性が高い=明示的に解放しないと、ハンドルをつかんだままになるおそれがある

どれも、instantiateするときはnewを使いますから、newを使うかどうかでは識別できないと思います。
    • good
    • 1
この回答へのお礼

managedの場合は参照を消して、その後はガベージコレクタに任せるということですね。
以前C++をやっていたので、明示的に開放しないと不安です・・・
いろいろ誤解している私にいろいろ教えてくださりありがとうございました!

お礼日時:2007/04/22 14:48

構造体は値型ですよね。


C# .NETの値型は、そもそも
「オブジェクトをヒープ(メモリ)に置く」ということをしないので、
(概念的には「値をとる」だけ。実際にはスタックに置かれる)
解放という概念もないと思いますが…

なお、Dispose()は意図的なリソース解放が必要、もしくは所望する場合に実装するもので、
managedリソースであれば、クラスオブジェクト(参照型)であってもそもそもDisposeは必須ではありません。

この回答への補足

ヒープとスタックについていろいろ調べました。
なるほど誤解してました。
構造体とクラスのオブジェクトにそんなちがいがあったとは知りませんでした。
そこで疑問がでてきたのですが
new演算子で確保したメモリの開放はできるんですよね?
できるのでしたらやり方も教えてください

補足日時:2007/04/21 23:38
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています