ページ 1 / 1
エラーで実行中落ちる
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 雷電
問題のコード [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Dim NowUnitNum As Long '現在のユニット数
Sub MainWnd_IDM_OPEN_MenuClick()
Dim ofn As OPENFILENAME
Dim FileName[MAX_PATH-1] As Byte
Dim i As Long
Dim i2 As Long
Dim buffer As String
Dim lpstrBuffer[254] As Byte
Dim lpstrBuffer2[254] As Byte
Dim lc As LVITEM
'OPENFILENAME構造体の初期化
FillMemory(VarPtr(ofn),Len(ofn),0)
ofn.lStructSize=Len(ofn)
ofn.hwndOwner=hMainWnd
ofn.lpstrFilter=Ex"SubAppendMission\0*.sam\0AppendMissionFiles\0*.apm\0テキストファイル\0*.txt\0すべてのファイル(*.*)\0*\0\0"
ofn.nFilterIndex=1
ofn.lpstrFile=FileName
ofn.nMaxFile=MAX_PATH
ofn.lpstrTitle="ファイルを開く"
ofn.Flags=OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST or OFN_EXPLORER or OFN_NOCHANGEDIR
ofn.lpstrDefExt="*"
'「ファイルを開く」ダイアログボックスを表示
If GetOpenFileName(ofn)=0 Then Exit Sub
'INIファイルからユニット数を読み込む
NowUnitNum=GetPrivateProfileInt("UnitSettings", "NumOfUnit", 0,FileName)
If NowUnitNum=0 Then
MessageBox(hMainWnd,"正常に読み込むことが出来ませんでした。","UnitAttachmenter",MB_OK)
Exit Sub
Else
i2=0
For i = 1 To NowUnitNum-1
wsprintf(buffer, "UnitSet%d", i)
GetPrivateProfileString(buffer,"UnitName", "", lpstrBuffer, 255,FileName)
GetPrivateProfileString(buffer,"Num","",lpstrBuffer2,255,FileName)
If lstrlen(lpstrBuffer) and lstrlen(lpstrBuffer2) Then
AddListItem(lpstrBuffer,GetDlgItem(hMainWnd,ListView1),i2)
SetListItem(lpstrBuffer2,GetDlgItem(hMainWnd,ListView1),i2,1)
i2=i2+1
End If
Next
End If
End Sub
オープンソースなのですが、最後の、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に切り替えてやってみます。
今回はどうもありがとうございました。