掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
メモリリークについて (ID:83623)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Nothingすればリークしない、という物でもありませんし、逆に Nothingしなければリークする、というわけでもありません。 オブジェクトは、内部的に「参照カウント」という物を持っています。 インスタンスは、「Set X = New Class1」などと変数等に参照された時に、 参照カウントが増加します(IUnknown.AddRef)。そして解放されると、 参照カウントは逆に減少するようになっています(IUnknown.Release)。 そしてカウントが 0 になった場合、どこからも参照されなくなったとされ、 そのオブジェクトが使用していたメモリも解放される仕組みになっています。 この仕組みがあるため、建前上は、 ・Nothingせずとも、変数がスコープ外になって破棄されれれば、 その参照カウントも現象する。 ・Nothing前に別のオブジェクトをセットした場合、元のインスタンスの 参照カウントは、Nothingした時と同様に減らされる。 ・そして、すべての参照が解放された(参照カウント=0)だった場合、 そのオブジェクトが使っていたメモリも破棄される。 という動作になるように設計されています。 しかし、CloseメソッドやDisposeメソッドなど、解放する前に呼び出すべき メソッドを呼んでいなかった場合は、オブジェクトは解放されても、それが 内部的に使っていたリソースの解放に問題が起きるケースは想定できます。 例えば、KB 289562などがこれに相当します。 『データベースの不要な拡張を防ぐにはレコードセットを明示的に閉じる』 http://support.microsoft.com/?kbid=289562 また、そのオブジェクトの作りに問題があって、循環参照などを 起こしていて、Nothingするだけでは解放されないケースもありえます。 http://www.microsoft.com/japan/developer/library/VBCon98/vbconcircularreferencesobjectlifetime.htm また、状況によっては「あえてNothingをしない」という運用もあります。 最初の例にあげられたADOなどの場合、「プーリング」という仕組みが あるのですが、それを(MTSやASPを使わずに)利用しようとした場合、 プール用の接続オブジェクトと、実際に使う接続オブジェクトを 2本用意して、プール用は「OpenしてすぐClose、でもNothingしない」 実際に使う方は「Open/Close/Nothingを通常通り行う」という コーディングが行われる事があるからです。 # まぁ、アプリ終了時にはプール用オブジェクトもNothingするわけですけど。 >> モジュールやコンポーネント内のものの方が多く > どのような時発生するのですか? DLL内部のバグなどによるものも考えられます。 上記のメモリの話は、COM(ActiveX)がらみのオブジェクトの話であって、 API等にてメモリの確保と解放を行った場合は、自動的に解放されません。 なので、コンポーネント内部でバグがあれば、コンポーネント自身を 解放しても、それが使っていたリソースが残ってしまう事はありえます。 こうなると、VB側では手の施しようが無いかも知れません。 古いVBほど、VB自身が引き起こすリークも多かったですし。 http://support.microsoft.com/search/default.aspx?InCC_hdn=True&InMT_hdn=true&QuerySource=gASr_Query&Catalog=LCID%3D1041%26CDID%3DJA-KB%26PRODLISTSRC%3DON&Product=vbJPN&Queryc=%E3%83%AA%E3%83%BC%E3%82%AF&Query=%E3%83%AA%E3%83%BC%E3%82%AF&KeywordType=ALL&maxResults=150&Titles=false&numDays=&InCC=on&InMT=on
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.