• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

そもそも、配列型変数にNothingをセットすることはできません。 質問文にまさしく書かれているとおり。 たぶんに、q3372573に嵌められただけかと。

usami33
質問者

お礼

回答ありがとうございます。 やはり嵌められたんですね。 態々時間をかけて試して損してしまいました。

その他の回答 (3)

  • ap_2
  • ベストアンサー率64% (70/109)
回答No.4

#補足にすぎませんが NothingはObjectの場合だけですね。配列はErase()で初期化します。 EraseでDim時の状態に戻ります。静的配列でもできます。 そして・・・ VB6やVBAの場合、ガベージコレクションが自動的にメモリを解放してくれるので、明示的にメモリ解放する必要はあまりナイかと。解放する癖つけた方がいいのは確かですが。 ------ ・Eraseしなくても解放されます → 関数を抜ける時に未使用のメモリが解放されるため、メモリリークの心配はほとんどありません。 ・Eraseしても即解放されるわけではない → ガベージコレクション対象にセットされるだけで、たいていは関数抜ける時解放されるみたいです。結局メモリ使用量減りません(※)。 ------ リンク先はそーいうコト(※)かと。MsgBoxでメモリ増えるとか謎ですし、MsgBox表示でプログラム止まる際にガベージコレクション走りそうですが・・・バージョンによる違いなのかな。。。

usami33
質問者

お礼

回答ありがとうございます。 Eraseの使用方法は判っているつもりで、 Nothingでもできる記述があったので試していたところなんです。

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.3

失礼しました。 エラーの発生箇所は 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でインデックスが有効範囲に入りませんから、開放されているようです。

usami33
質問者

お礼

回答ありがとうございます。 Eraseの使用方法は判っているつもりで、 Nothingでもできる記述があったので試していたところなんです。

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.1

> Dim wProcDat() As Long これは一次元配列 > ReDim wProcDat(1 To 1000, 1 To 768) これは二次元配列ですね。 Dim wProcDat(1,1) As Long としてもエラーになりますか?

usami33
質問者

補足

(1,1)にしても同じエラーになりました。 2次元配列はNGなんですかね?

関連するQ&A