ページ 11

エラーで実行中落ちる

Posted: 2007年4月20日(金) 21:40
by 雷電
最近またプログラムを組み始めて、思ってもいないエラーに遭遇しました。

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

この英語はどういう意味なんですか?

Posted: 2007年4月20日(金) 21:59
by tak
ヒープ領域を解放するときに安全性チェックが行われるのですが、そのテストで引っかかった可能性が高いです。

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

まずはそのような間違いのありそうな箇所を探してみてください。

Posted: 2007年4月20日(金) 22:16
by 雷電
オープンソースなのですが、最後の、End Subでエラーです。
hiraさんの、サンプルコードを使用させていただいています。(AddListItem,SetListItem)

おかしなコードを書いてしまっているでしょうか?

Posted: 2007年4月21日(土) 00:00
by xss0423
bufferが原因のような
String型は宣言された時点である程度メモリを確保してくれていますが、Forの下の操作で溢れていると思います

Posted: 2007年4月21日(土) 00:11
by xss0423
#console

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

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

Dim buffer[15] As Byteに置き換えてみて下さい

Posted: 2007年4月21日(土) 01:00
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 関数

Posted: 2007年4月21日(土) 12:04
by 雷電
wsprintf(buffer, "UnitSet%d", i)

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

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

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

どうしたものでしょう?

追記:

buffer[20] As Byte
で、代用したところ、
wsprintf(buffer, "UnitSet%d", i)
この直後でアクセス違反が起こります。

Posted: 2007年4月21日(土) 16:55
by tak
Thread.abて、それAB5のβ版ではないですか?
すみません、こっちは4.24を前提に話をしていました。

ZeroString() はライブラリのバグとして、こちらで対処します。
4.24だと ZeroString() は問題なく使えます。

Posted: 2007年4月21日(土) 22:07
by 雷電
まだAB5のβは安定してないみたいですね。
こっちの開発も、4.24に切り替えてやってみます。

今回はどうもありがとうございました。