dポイントプレゼントキャンペーン実施中!

Visual Basic6(SP5)で開発を行っているものです。
時々、「メモリが"Read"になることができませんでした」と言うエラーメッセージと共にVisual Basicのアプリケーションが終了する不具合が発生します。メモリ操作関連のエラーだろうと社内で指摘されました。

怪しいかと思われるのは、ある動的配列をRedimし、解放する必要が無いのでEraseしていない点です。

動的配列は、RedimしたらEraseしないとエラーの元になり得るのでしょうか? 時間のある方、ご回答願います。

A 回答 (3件)

多分、直接的には関係ないと思われます。


ポインタをまともに扱うことのないVBでは
領域侵害などが発生する機会が少ないからです。

過去に相当大きな空間(200M)をredimで確保したままにしたことがありますが、
ご質問のエラーに遭遇したことはありません。

もし疑うのであれば、memorycopy、Bitbltなどの
メモリ転送APIの方がよほどたちが悪いです。

redimの場合はOSが勝手にアドレス空間を確保してくれるはずなので、
それができていないとすれば重大な障害がある感じがします。

マシンに依存する問題の可能性も捨て切れません。
社内ということなので、この辺りの問題は切り分け済みでしょうが、
参考までに挙げてみました。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。
No2の方にも指摘されましたが、APIを利用したメモリ転送を行っています。
そして思い起こせば、質問のエラーが起こり始めたのは、そのAPI関数の実行を阻害する可能性のある処理を追加した頃からです。

そのあたりを調べてみます。

お礼日時:2006/09/17 00:51

> 動的配列は、RedimしたらEraseしないとエラーの元になり得るので


> しょうか?

エラーには必ず原因があるわけですが、原因解明にできるだけ手間を
かけないようにするためにも動的配列やオブジェクト変数などは、
使い終わった時点で私は明示的にクリアしています。

広域変数もなるべく使わないようにし、使う前に必ず明示的に初期化
し、使い終わったらクリアしています。

>「メモリが"Read"になることができませんでした」

意味不明のエラーメッセージですが、意図するところは、

 「参照したメモリの内容を読み取ることができませんでした」

です。動的配列がこのエラーの原因となり得るのかはコードを見ない
と何とも言えませんが、よくあるのは API 絡みですね。宣言ミスと
か使い方のミスとか。もし、API を使っているなら確認してみて下さ
い。
    • good
    • 0
この回答へのお礼

ありがとうございました。
今さらになって思うのは、「怪しい」と私自身が思っているなら明示的にEraseしておけばよかっただけかも知れません。
APIは確かに使っています。

お礼日時:2006/09/17 00:38

広域変数だとメモリに残ってしまうことがあるので


(といってもExcel VBAですが)
自分はすべてEraseするクセをつけてます。
    • good
    • 0
この回答へのお礼

ありがとうございます。

「広域変数だとメモリに残ってしまうことがある」時点で、確実にEraseする必要がありそうですね。

お礼日時:2006/09/16 11:10

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

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


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