Set cn = Nothingとcn.Closeの違いはあるのでしょうか??
メモリリークとの関係は??など考えるほど意味がわからなくなってきてしまいました。どなたかご説明を下さると助かります。
・とりあえず、環境を明記してください。
で、違いとしては、
・Set cn=Nothing
→cnという何かに非参照参照を設定している。
・cn.Close
→cnという何かのメンバ、Closeを示している。
ということです。
コンパイルエラーが起こることを予想すれば、コレくらいしかかけません…かもね(ぇ
cn.Close で閉じてから
Set cn = Nothing で参照を開放すると確実なのではないかと
※それでエラーが出たらすんません
今だに、Set cn = Nothing の解釈を勘違いしている方が多いんですよね。(^^)
「解放」なんて表現をしているコメントが多すぎです。orz
それと、宣言と同時に New していたら、それこそ意味がない。orz
>宣言と同時に New していたら、それこそ意味がない。
とはなぜですか?教えてもらえたら助かります。
…なんか…ある程度知識がないと理解できないレスになってる気が…。
>それと、宣言と同時に New していたら、それこそ意味がない。orz
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200506/05060038.txt
[VB6.0]だと Nothing してても変数を呼び出した時点でインスタンスが生成される
という仕様があります。open してなければ良い気もしますが…色々2次的な問題も…。
Set cn = Nothing しても cn.Close されません。Set cn = Nothing は
cn.Close しないで Set cn = 新しいcn としてるの同じ問題を持ってます。
どちらもデータベースの接続を開き続ける結果となり、制限を超えると
エラーが出ると思います。
[メモリリーク]
http://e-words.jp/w/E383A1E383A2E383AAE383AAE383BCE382AF.html
メモリリークよりデータベース側の制限に先に引っ掛かると思いますが?。
メモリリークするほど接続を開けないと思います。エラーメッセージも
データベース側のものが出そうです。
>Set cn = Nothing しても cn.Close されません。Set cn = Nothing は
あ、もちろん cn.Close しないで Set cn = Nothing する場合ね?
で、
>通ってみた 2005/06/27(月) 12:07:15
>cn.Close で閉じてから
>Set cn = Nothing で参照を開放すると確実なのではないかと
という流れにします。
ボクより知識のある方々のログ発見。
http://madia.world.coocan.jp/vb/vb_bbs/200405_04050104.html
oo4oだと、Closeしなくても大丈夫。
…オレだけ違う回答書いてるよなぁ…
もしかして暗黙の了解で"cn"はデータベース関係のオブジェクトに使う変数なのか…(orz
※Closeメンバもあることだし、なんとなくそんな予感はするけどなぁ…
一応つけたし
×set cn=nothing ⇔ cn.Close
○set cn=nothing と cn.close は全く別の意味。
・set cn=nothing:
cnというオブジェクト変数に非参照を参照させる。
→もしかしたら、元のインスタンスが全く参照されなくなったらcn.Closeを
呼んでくれるかもね…
まぁ、それは内部仕様なので全く不明。
→VB6なら"As New"で宣言するとごちゃごちゃになる様なので…
スコープ抜けるまで放置が一番かも(ぇ
・cn.Close
cnというオブジェクト変数が参照しているインスタンスのメンバCloseを示す。
→それだけ。
※ノシ<なんか著しくスレの内容を下げているガッでした。
Set cn = Nothingは『参照の開放』、『参照の解除』ということははっきりしている。
Set cn = Nothingとメモリーリークの関係は、 Set cn = Nothingで全ての参照が開放されると、
参照カウンターが0になりメモリーが開放される、しかしバグにより全ての参照が開放されても
メモリーが開放されないことが起こる。これがメモリーリークである、これはあくまでもバグである。
>データベースの接続を開き続ける結果となり、制限を超えるとエラーが出ると思います。
これはプログラムが正しくメモリーを確保した結果、メモリーが足りなくなっただけで、
VBのバグで有っても、メモリーリークではない。
メモリーリークはVB側ではあくまでも正規の手続きによって全ての参照を開放しても、メモリーが
開放されないことを言います。
明らかにメモリーリークを起こすOCXやDLLを使わない限り、VBでメモリーリークを起こすことは
難しい。
Windows2000やXpの様にWindowsがNT系になり、メモリーのプロテクト領域へのアクセス制限が
厳しくなって、ずいぶんメモリーリークが減った、そのぶんある程度いいかげんなメモリー管理
で動いていたDLLが2000やXpで使えなくなると言うことが起こった。
cn.CloseはあくまでもcnクラスのメンバーCloseを指しているだけ、何をしてるかは実装によって
異なり、メモリーリークとは無関係。
DBじゃない可能性もあるね(@o@)TCPのconnectionのcnとか・・
でも、基本は同じだよね?
「NEW」したら、「Nothing」・「Open」したら「Close」って事で・・・
>cn の可能性
ぶっちゃけ、自分で作成したクラスでもいいよねw。
1人でそこまで突っ込んでる暇は無いのでそれぞれの
立場で色々なレスが付くのでいいと思います。
…という事で
>※ノシ<なんか著しくスレの内容を下げているガッでした。
残念ながら感謝してますw
という事でメモリリークはメモリリークをメインに
調べないと理解できない…と。
Close メソッドを呼ばない Set cn = Nothing による
『参照の開放』、『参照の解除』はアプリの強制終了に
似てるね。終了処理すっとばして『VB側でもう管理しま
せんよ〜』って見放しちゃうから、わざわざ Close メソッ
ドを用意してるオブジェクトでは都合が悪い事が多い。
…メモリリークにつながる可能性もある。VBの建前から
するとVBによる参照がなくなった時点で何もかも開放
されて欲しいけど、ちゃんと最後まで面倒をみるプログラム
を心掛けましょう。
『家に帰るまでが遠足です』(ぇ
ツイート | ![]() |