- ベストアンサー
Redimした動的配列はEraseする必要があるのか
Visual Basic6(SP5)で開発を行っているものです。 時々、「メモリが"Read"になることができませんでした」と言うエラーメッセージと共にVisual Basicのアプリケーションが終了する不具合が発生します。メモリ操作関連のエラーだろうと社内で指摘されました。 怪しいかと思われるのは、ある動的配列をRedimし、解放する必要が無いのでEraseしていない点です。 動的配列は、RedimしたらEraseしないとエラーの元になり得るのでしょうか? 時間のある方、ご回答願います。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
多分、直接的には関係ないと思われます。 ポインタをまともに扱うことのないVBでは 領域侵害などが発生する機会が少ないからです。 過去に相当大きな空間(200M)をredimで確保したままにしたことがありますが、 ご質問のエラーに遭遇したことはありません。 もし疑うのであれば、memorycopy、Bitbltなどの メモリ転送APIの方がよほどたちが悪いです。 redimの場合はOSが勝手にアドレス空間を確保してくれるはずなので、 それができていないとすれば重大な障害がある感じがします。 マシンに依存する問題の可能性も捨て切れません。 社内ということなので、この辺りの問題は切り分け済みでしょうが、 参考までに挙げてみました。
その他の回答 (2)
- KenKen_SP
- ベストアンサー率62% (785/1258)
> 動的配列は、RedimしたらEraseしないとエラーの元になり得るので > しょうか? エラーには必ず原因があるわけですが、原因解明にできるだけ手間を かけないようにするためにも動的配列やオブジェクト変数などは、 使い終わった時点で私は明示的にクリアしています。 広域変数もなるべく使わないようにし、使う前に必ず明示的に初期化 し、使い終わったらクリアしています。 >「メモリが"Read"になることができませんでした」 意味不明のエラーメッセージですが、意図するところは、 「参照したメモリの内容を読み取ることができませんでした」 です。動的配列がこのエラーの原因となり得るのかはコードを見ない と何とも言えませんが、よくあるのは API 絡みですね。宣言ミスと か使い方のミスとか。もし、API を使っているなら確認してみて下さ い。
お礼
ありがとうございました。 今さらになって思うのは、「怪しい」と私自身が思っているなら明示的にEraseしておけばよかっただけかも知れません。 APIは確かに使っています。
- xdaix
- ベストアンサー率66% (2/3)
広域変数だとメモリに残ってしまうことがあるので (といってもExcel VBAですが) 自分はすべてEraseするクセをつけてます。
お礼
ありがとうございます。 「広域変数だとメモリに残ってしまうことがある」時点で、確実にEraseする必要がありそうですね。
お礼
回答、ありがとうございます。 No2の方にも指摘されましたが、APIを利用したメモリ転送を行っています。 そして思い起こせば、質問のエラーが起こり始めたのは、そのAPI関数の実行を阻害する可能性のある処理を追加した頃からです。 そのあたりを調べてみます。