25

最近、私はある質問に出くわし、ドキドキしました。それは私を忙しくさせ、ネット上でそれについての明確な説明を見つけることができませんでした.
これは、Excel オブジェクトの破壊に関連しています (これは私が常に使用しており、これまで実際に疑問に思ったことはありません)。

私の質問につながる背景:
通常のオブジェクトでは、キーワード SET および NEW を使用してオブジェクトをインスタンス化できます。例えば:

Set classInstance = New className

この方法でインスタンス化するたびに、オブジェクトがヒープ メモリ内に作成され、参照カウンターが 1 増加します。
これ以上参照を追加しない場合、次のステートメントは参照カウントをゼロに戻します。

Set classInstance = Nothing 

参照カウントが 0 になると、オブジェクトは破棄されてメモリからクリアされ、「classInstance」は を指します。

私が読んだこと:
「CREATEOBJECT」関数を使用すると、COM オブジェクトへの参照が返されます。

Set oApp = CreateObject("Excel.Application")

とはいえ、次のように言えます。

Set oApp = nothing 

オブジェクトの参照カウントは 0 になり、oApp はオブジェクトをポイントしなくなります。

私の質問:
1) オブジェクトが実際にメモリから削除される前に、このタイプのオブジェクトがメソッド .Quit を呼び出す必要があるのはなぜですか?
.close メソッドを必要とするワークブック オブジェクト (workbooks.add または workbook.open) への参照を追加する場合も同様です。参照カウントをゼロにしたときに、これらのオブジェクトを自動的に破棄できないのはなぜですか?
たとえば、次のように言う場合です。

set oRange = nothing 

2) そして、次のことを言う必要がありますか?

oApp.Quit
set oApp = nothing 

.Quit を適用すると、Application オブジェクトは既にメモリからクリアされているため、解放されるオブジェクトはもうありません。
私が思いついた唯一の理由は、Quit 後に oApp が Nothing に設定される理由は、(ヒープ上の) 未使用のメモリ位置を指している可能性があり、このメモリが再割り当てされた場合に後で混乱を招く可能性があるためです。 (ただし、VBAではこれを想像するのは難しいと思います)。この結論が正しいかどうか自問自答していたので、答えを知っている人からその確認を受けたい.
これが間違っているかどうか教えてください。

3)VBAで「オブジェクトへの参照」と呼ばれるもの(上記のコードのoAppなど)は、Cのポインター変数と見なされます。このステートメントを使用しても安全でしょうか、それとも間違っていますか?

一般的に適用するのは難しいことではありません。終了して何も設定しませんが、トピックに関する正確な情報を受け取るとよいでしょう。なぜ私がそれをしているのかを100%知るために。

4

2 に答える 2

12

良い質問 :)

Excel は、そのオブジェクトの作成を制御します。同様に、それらの破壊も制御します。

設定oApp = Nothingすると、オブジェクト参照が破棄されるだけです。アプリケーションは削除されません。Excel オブジェクトを破棄するには、その.Quitメソッドを使用する必要があります。

を行うたびに、関連するオブジェクトにSet x = Nothing指定された参照 (ポインター)が削除されます。xこれは、オブジェクト自体がメモリから削除されるという意味ではありません。オブジェクトがメモリから削除されるかどうかは、さまざまな要因によって異なります。

  1. 同じオブジェクトを指している参照が他にあるかどうか。存在する場合、オブジェクトは削除されません。参照カウントはゼロでなければなりません。
  2. そのオブジェクトのデストラクタの内部実装。

この.Quitメソッドは、Excel が割り当てたすべてのメモリ オブジェクトを丁寧に削除し、それ自体を閉じるように定義されています。

CloseVB6 のフォームでの呼び出しに似ています。たとえば、vb6 のフォームを見てみましょう。

Dim f As Form
Set f = Form1
f.Show

'
'~~> Rest of the code
'

Set f = Nothing

これはフォームを破壊しますか?:)

ファローアップ

質問2はどうですか?ありがとう – Kim Gysen 14分前

ここに画像の説明を入力

ここに示されているとおりではない可能性があり、コンパイラの最適化により動作が異なる場合があります... しかし、これが機能している基本的な概念です。

于 2012-07-09T13:39:19.727 に答える