Set cn = Nothing と cn.Close について


momo  2005-06-27 20:49:45  No: 123088

Set cn = Nothingとcn.Closeの違いはあるのでしょうか??
メモリリークとの関係は??など考えるほど意味がわからなくなってきてしまいました。どなたかご説明を下さると助かります。


ガッ  2005-06-27 20:56:33  No: 123089

・とりあえず、環境を明記してください。
で、違いとしては、
・Set cn=Nothing
  →cnという何かに非参照参照を設定している。
・cn.Close
  →cnという何かのメンバ、Closeを示している。
ということです。
コンパイルエラーが起こることを予想すれば、コレくらいしかかけません…かもね(ぇ


通ってみた  2005-06-27 21:07:15  No: 123090

cn.Close  で閉じてから
Set cn = Nothing  で参照を開放すると確実なのではないかと

※それでエラーが出たらすんません


じゃんぬねっと  URL  2005-06-27 21:37:14  No: 123091

今だに、Set cn = Nothing の解釈を勘違いしている方が多いんですよね。(^^)
「解放」なんて表現をしているコメントが多すぎです。orz
それと、宣言と同時に New していたら、それこそ意味がない。orz


momo  2005-06-27 22:03:52  No: 123092

>宣言と同時に New していたら、それこそ意味がない。
とはなぜですか?教えてもらえたら助かります。


特攻隊長まるるう  2005-06-27 22:09:10  No: 123093

…なんか…ある程度知識がないと理解できないレスになってる気が…。
>それと、宣言と同時に 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
メモリリークよりデータベース側の制限に先に引っ掛かると思いますが?。
メモリリークするほど接続を開けないと思います。エラーメッセージも
データベース側のものが出そうです。


特攻隊長まるるう  2005-06-27 22:12:51  No: 123094

>Set cn = Nothing しても cn.Close されません。Set cn = Nothing は
あ、もちろん cn.Close しないで Set cn = Nothing する場合ね?
で、
>通ってみた 2005/06/27(月) 12:07:15
>cn.Close  で閉じてから
>Set cn = Nothing  で参照を開放すると確実なのではないかと
という流れにします。


特攻隊長まるるう  2005-06-27 22:44:46  No: 123095

ボクより知識のある方々のログ発見。
http://madia.world.coocan.jp/vb/vb_bbs/200405_04050104.html


id_rsa+  2005-06-28 05:20:54  No: 123096

oo4oだと、Closeしなくても大丈夫。


ガッ  2005-06-28 05:38:36  No: 123097

…オレだけ違う回答書いてるよなぁ…
もしかして暗黙の了解で"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を示す。
  →それだけ。

※ノシ<なんか著しくスレの内容を下げているガッでした。


ねろ  2005-06-28 06:55:15  No: 123098

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を指しているだけ、何をしてるかは実装によって
異なり、メモリーリークとは無関係。


id_rsa+  2005-06-28 07:00:23  No: 123099

DBじゃない可能性もあるね(@o@)TCPのconnectionのcnとか・・
でも、基本は同じだよね?

「NEW」したら、「Nothing」・「Open」したら「Close」って事で・・・


特攻隊長まるるう  2005-06-28 19:30:10  No: 123100

>cn の可能性
ぶっちゃけ、自分で作成したクラスでもいいよねw。
1人でそこまで突っ込んでる暇は無いのでそれぞれの
立場で色々なレスが付くのでいいと思います。
…という事で
>※ノシ<なんか著しくスレの内容を下げているガッでした。
残念ながら感謝してますw

という事でメモリリークはメモリリークをメインに
調べないと理解できない…と。

Close メソッドを呼ばない Set cn = Nothing による
『参照の開放』、『参照の解除』はアプリの強制終了に
似てるね。終了処理すっとばして『VB側でもう管理しま
せんよ〜』って見放しちゃうから、わざわざ Close メソッ
ドを用意してるオブジェクトでは都合が悪い事が多い。
…メモリリークにつながる可能性もある。VBの建前から
するとVBによる参照がなくなった時点で何もかも開放
されて欲しいけど、ちゃんと最後まで面倒をみるプログラム
を心掛けましょう。

『家に帰るまでが遠足です』(ぇ


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加