- ベストアンサー
VB6のメモリ解放に関して
お世話になります VB6のメモリ解放に関して、以下を参考に下記のコードで試したのですが、 コンパイルエラーで「配列には割り当てられません」となってしまいます。 http://okwave.jp/qa/q3372573.html 違いは宣言の型がStringかLongしかないと思うのですが、 なにが悪いのか教えていただけないでしょうか ******* 以下 ソース Dim wProcDat() As Long ReDim wProcDat(1 To 1000, 1 To 768) 中略 Set wProcDat = Nothing
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
そもそも、配列型変数にNothingをセットすることはできません。 質問文にまさしく書かれているとおり。 たぶんに、q3372573に嵌められただけかと。
その他の回答 (3)
- ap_2
- ベストアンサー率64% (70/109)
#補足にすぎませんが NothingはObjectの場合だけですね。配列はErase()で初期化します。 EraseでDim時の状態に戻ります。静的配列でもできます。 そして・・・ VB6やVBAの場合、ガベージコレクションが自動的にメモリを解放してくれるので、明示的にメモリ解放する必要はあまりナイかと。解放する癖つけた方がいいのは確かですが。 ------ ・Eraseしなくても解放されます → 関数を抜ける時に未使用のメモリが解放されるため、メモリリークの心配はほとんどありません。 ・Eraseしても即解放されるわけではない → ガベージコレクション対象にセットされるだけで、たいていは関数抜ける時解放されるみたいです。結局メモリ使用量減りません(※)。 ------ リンク先はそーいうコト(※)かと。MsgBoxでメモリ増えるとか謎ですし、MsgBox表示でプログラム止まる際にガベージコレクション走りそうですが・・・バージョンによる違いなのかな。。。
お礼
回答ありがとうございます。 Eraseの使用方法は判っているつもりで、 Nothingでもできる記述があったので試していたところなんです。
- samtomsan
- ベストアンサー率55% (1060/1897)
失礼しました。 エラーの発生箇所は Set wProcDat = Nothing ですね。 下記によると動的配列には Erase を使うようです。 http://www.moug.net/tech/acvba/0050008.html 下記のプログラムを作ってみました。 Dim wProcDat() As Long ReDim wProcDat(1 To 1000, 1 To 768) wProcDat(1000, 768) = 999 wProcDat(1, 1) = 888 MsgBox wProcDat(1000, 768) Erase wProcDat MsgBox "Erase" MsgBox wProcDat(1, 1) 最後のMsgBoxでインデックスが有効範囲に入りませんから、開放されているようです。
お礼
回答ありがとうございます。 Eraseの使用方法は判っているつもりで、 Nothingでもできる記述があったので試していたところなんです。
- samtomsan
- ベストアンサー率55% (1060/1897)
> Dim wProcDat() As Long これは一次元配列 > ReDim wProcDat(1 To 1000, 1 To 768) これは二次元配列ですね。 Dim wProcDat(1,1) As Long としてもエラーになりますか?
補足
(1,1)にしても同じエラーになりました。 2次元配列はNGなんですかね?
お礼
回答ありがとうございます。 やはり嵌められたんですね。 態々時間をかけて試して損してしまいました。