エラーで実行中落ちる

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
雷電
記事: 104
登録日時: 2006年8月21日(月) 14:26
お住まい: 兵庫県
連絡する:

エラーで実行中落ちる

#1 投稿記事 by 雷電 »

最近またプログラムを組み始めて、思ってもいないエラーに遭遇しました。

Invalid Address specified to RtlFreeHeap
Heap block at 01150DA8 modified at 01150DB1 past requested size of 1
???なぬ?これは何だ・・・
コンパイルは一応通りますが、実行中にエラーで落ちます。
でも、何ゆえか、リリースコンパイルではなく、デバッグモードでは落ちません。

この英語はどういう意味なんですか?
===============================
MyHomePage;; raiden.no.land.to/
===============================
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#2 投稿記事 by tak »

ヒープ領域を解放するときに安全性チェックが行われるのですが、そのテストで引っかかった可能性が高いです。

たとえば malloc() で 1 バイトのメモリ領域を確保したとします。
このとき &H01150DA8 に割と近い場所が確保できるはずです。
プログラムにバグがあり、誤って本来書き込んではいけない &H01150DB1 の値を書き換えたら、free() したときにこのような警告が発生します。

まずはそのような間違いのありそうな箇所を探してみてください。
雷電
記事: 104
登録日時: 2006年8月21日(月) 14:26
お住まい: 兵庫県
連絡する:

#3 投稿記事 by 雷電 »

オープンソースなのですが、最後の、End Subでエラーです。
hiraさんの、サンプルコードを使用させていただいています。(AddListItem,SetListItem)

おかしなコードを書いてしまっているでしょうか?
===============================
MyHomePage;; raiden.no.land.to/
===============================
xss0423

#4 投稿記事 by xss0423 »

bufferが原因のような
String型は宣言された時点である程度メモリを確保してくれていますが、Forの下の操作で溢れていると思います
xss0423

#5 投稿記事 by xss0423 »

#console

Dim a As String
wsprintf(a,"UnitSet%d",5)

これを試しに実行したらヒープエラー吐きました
やっぱりbufferが原因のようです

Dim buffer[15] As Byteに置き換えてみて下さい
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#6 投稿記事 by tak »

xss0423 さんが書きました:#console

Dim a As String
wsprintf(a,"UnitSet%d",5)

これを試しに実行したらヒープエラー吐きました
やっぱりbufferが原因のようです
こちらでも確認できましたが、確保されたサイズは (requested size of)5 バイトでした。
考えてみれば確かに 長さ情報 (4 bytes) + 終端ヌルキャラクタ で計算上は合うのですが、はて。

Byte 配列で代用するという手もありますが、AB5から文字型の扱いが拡張されることから、避けておいた方が無難です。
String 型のままバッファを拡げたい場合は ZeroString() が使えます。これも非公式関数なので怪しいところですが。

追記 2007/4/21 4:19
非公式とおもったら、ありました、ZeroString 関数
雷電
記事: 104
登録日時: 2006年8月21日(月) 14:26
お住まい: 兵庫県
連絡する:

#7 投稿記事 by 雷電 »

wsprintf(buffer, "UnitSet%d", i)

この直前に一応ZeroString関数で25byte確保してデバッグしてみると、

Thread.abの140行目でアクセス違反が起こってしまいました。

Forの直前にするとまたもヒープエラーです。

どうしたものでしょう?

追記:

buffer[20] As Byte
で、代用したところ、
wsprintf(buffer, "UnitSet%d", i)
この直後でアクセス違反が起こります。
===============================
MyHomePage;; raiden.no.land.to/
===============================
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#8 投稿記事 by tak »

Thread.abて、それAB5のβ版ではないですか?
すみません、こっちは4.24を前提に話をしていました。

ZeroString() はライブラリのバグとして、こちらで対処します。
4.24だと ZeroString() は問題なく使えます。
雷電
記事: 104
登録日時: 2006年8月21日(月) 14:26
お住まい: 兵庫県
連絡する:

#9 投稿記事 by 雷電 »

まだAB5のβは安定してないみたいですね。
こっちの開発も、4.24に切り替えてやってみます。

今回はどうもありがとうございました。
===============================
MyHomePage;; raiden.no.land.to/
===============================
返信する