- ベストアンサー
オブジェクトの開放
VBでCreateObjectの直後に Set xxx = Nothing が入っているのですが、どうやら効いていないようなのです(メモリ使用量が増え続ける)。 高速で処理されている場合 Set xxx = Nothing は効かないのでしょうか?。 教えて下さい。宜しくお願い致します。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
いや、頼るも何も、勝手に答えるだけ。 わからなそうだったら、無口になる。 1.環境を書く。 2.たとえわからなくても、レスを返す。 わからないなら、どのあたりがうまく行かないかの詳細を記す 3.普段から質問をきちんと締め切る。 そういう人には、何とか解決しようと、努力する。 そうじゃなければ、途中で投げ出す可能性大。 他の人だって同じ気持ちなんじゃないかな? http://oshiete1.goo.ne.jp/kotaeru.php3?qid=582393 で名前を二人挙げているけど、ここの掲示板でツワモノが数人いるから、その人たちの方が心強いかも。
その他の回答 (7)
- 2ch
- ベストアンサー率51% (64/125)
CreateObject と Nothing これを使用すると、言わずと知れていると思いますが、 1.PCの空きメモリ領域調査 2.メモリの確保 3.開放 という処理をします。 それを1秒間隔でするとなると、メモリ確保でコケる可能性は大いにあります。 ロジックであっていようとも、コケるのは、Windowsの仕様です。 ちなみにWin98が出るときに、生放送でCNNに出演した、(自信満々の)ビルゲイ○氏の目の前で、PCがハングアップを起こしました。 OSを立ち上げただけです。 オブジェクトを開放しないで、生成したインスタンスを継承したままの方が、メモリリークしないかもしれません。
お礼
本当にありがとうございます。2chさんからご回答を頂き、自信が持てました。 いろいろ私の説明が至らなくてご迷惑をお掛けして申し訳ありませんでした。 まだテスト中なので、また何かありましたらご相談に乗って下さいね。 頼りにしていますので宜しくお願い致します。 こんな私に頼られると迷惑ですかね?。
- 2ch
- ベストアンサー率51% (64/125)
>1秒 それはタイマーが負荷を与えているだけだよ。 要検証:新規プロジェクトを起こして、単純なプログラムを作って、タイマがOSにどれだけ負荷をかけるか
お礼
ありがとうございます。 オブジェクト作成を初期処理にオブジェクト解放を終了処理に移動した結果、ハンドル数、メモリ使用量ともに増減が少なくなりました。当初から最終的にはこうしようと思っていたのですが、コーディング上問題が無い為調べておりました。簡単なプログラムを作成してDoo Loopの中にオブジェクト作成、解放を入れた時、外に出した時ではハンドル数、メモリ数とも大きな開きがありました。中に入れたときは38時間後にハンドルリークを起したぐらいです。外に出したときは大した増減もなく3日間流れました。 今は初期処理、終了処理に分けて1週間の稼動確認中です。
- 2ch
- ベストアンサー率51% (64/125)
オブジェクト変数なのですね。 レイトバインディングで、オブジェクトを生成しているなら、改善の余地はありません。 デバッグして確かめましたか?Nothingされているはずです。 メモリを消費が激しいのは、一つの処理がものすごく長いなど、他に原因がありませんか?
お礼
度々ありがとうございます。 ここの部分の処理は1秒に1度行われ、24時間稼動のシステムなのです。 他の原因も含めいろいろ調査してみます。
- 2ch
- ベストアンサー率51% (64/125)
>New 型では宣言していませんでした。 なら、どう宣言して、何をCreateObjectで作っているかがわからないと書かないと、書きようが無い。
お礼
大変失礼致しました。 Public xxx As Object Set xxx = CreateObject("aaa.bbb") Set xxx = Nothing のように記述しています。
- taknt
- ベストアンサー率19% (1556/7783)
参考URLを参照してみてください。
お礼
早速のご回答ありがとうございました。
- 2ch
- ベストアンサー率51% (64/125)
その宣言が Dim 変数 as New 型 でNewで宣言しているからじゃないの? New宣言は、お勧めしない。
お礼
早速のご回答ありがとうございます。 New 型では宣言していませんでした。
- happypoint
- ベストアンサー率36% (521/1422)
こんにちは。 どこかでトラップがかかって Set…Nothingの行が読み飛ばされてるとか。
お礼
早速のご回答ありがとうございます。 読み飛ばしはありませんでした。
お礼
いろいろとありがとうございます。 上記の3点肝に命じときます。