大人になっても苦手な食べ物、ありますか?

お世話になります

VB6のメモリ解放に関して、以下を参考に下記のコードで試したのですが、
コンパイルエラーで「配列には割り当てられません」となってしまいます。

http://oshiete.goo.ne.jp/qa/3372573.html

違いは宣言の型がStringかLongしかないと思うのですが、
なにが悪いのか教えていただけないでしょうか


******* 以下 ソース

Dim wProcDat() As Long

ReDim wProcDat(1 To 1000, 1 To 768)

中略

Set wProcDat = Nothing

A 回答 (4件)

そもそも、配列型変数にNothingをセットすることはできません。


質問文にまさしく書かれているとおり。

たぶんに、q3372573に嵌められただけかと。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

やはり嵌められたんですね。

態々時間をかけて試して損してしまいました。

お礼日時:2013/09/17 11:34

#補足にすぎませんが


NothingはObjectの場合だけですね。配列はErase()で初期化します。
EraseでDim時の状態に戻ります。静的配列でもできます。

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

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

お礼日時:2013/09/17 11:33

失礼しました。


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

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

お礼日時:2013/09/17 11:32

> Dim wProcDat() As Long


これは一次元配列
> ReDim wProcDat(1 To 1000, 1 To 768)
これは二次元配列ですね。

Dim wProcDat(1,1) As Long
としてもエラーになりますか?

この回答への補足

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

補足日時:2013/09/09 19:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A