• ベストアンサー

C#の構造体の開放のしかた

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

質問者が選んだベストアンサー

  • ベストアンサー
  • nep0707
  • ベストアンサー率39% (902/2308)
回答No.2

>new演算子で確保したメモリの開放はできるんですよね? newはインスタンスを新しく作るときは何でも使いますから、newを使っているかどうかというよりは、 そのときに作ったインスタンスの種類によって場合分けして考えたほうがいいです。 ・構造体=値型のインスタンス=メモリにはそもそも入らない。スタックに入る。 ・通常のクラスや配列=参照型のインスタンス=managedリソースのヒープに入る。参照が消えれば、ガベージになり、そのうちガベージコレクタ(GC)で掃除される。 ・System.Drawing以下やSystem.IO以下にあるクラスはunmanagedリソースを使っている可能性が高い=明示的に解放しないと、ハンドルをつかんだままになるおそれがある どれも、instantiateするときはnewを使いますから、newを使うかどうかでは識別できないと思います。

ganchandesuyo
質問者

お礼

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

その他の回答 (1)

  • nep0707
  • ベストアンサー率39% (902/2308)
回答No.1

構造体は値型ですよね。 C# .NETの値型は、そもそも 「オブジェクトをヒープ(メモリ)に置く」ということをしないので、 (概念的には「値をとる」だけ。実際にはスタックに置かれる) 解放という概念もないと思いますが… なお、Dispose()は意図的なリソース解放が必要、もしくは所望する場合に実装するもので、 managedリソースであれば、クラスオブジェクト(参照型)であってもそもそもDisposeは必須ではありません。

ganchandesuyo
質問者

補足

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

関連するQ&A