トップページ > 過去ログ > 記事閲覧
HEAPに関するエラーが出ます。
名前:T.O 日時: 2009/02/15 13:56

はじめまして、お世話になっております。 DXlib使わせていただいています。 BorlandC++ Compiler 5.5と VisualC++ 2008 Express Edition(以下VC++) の両方を使っていまして、 VC++のほうはバグ取りのためだけに使っています。 VC++のほうだけで以下のようなエラーが出てしまいます。 「HEAP: Free Heap block XXXXX modified at XXXXX after it was freed.」 「Windows によって proj1.exe でブレークポイントが発生しました。 ヒープが壊れていることが原因として考えられます。proj1.exe または読み込まれた DLL にバグがあります。 あるいは、proj1.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。」 というようなエラーです。 newをしている部分とdeleteをしている部分で起こるようです。 無視して続けても平気だったりしますし、BorlandC++のほうでは何の異常もなく動きます。 これは無視していたらまずいのでしょうか? それと、もうひとつお尋ねしたいことがあります。 背景のマップを描画する際、 32*32ドットぐらいの細かいマップチップを敷き詰めるのと、一枚絵をドカッと描画させるのでは どちらが動作が軽いでしょうか? 以上、よろしくお願いいたします。

Page: 1 |

Re: HEAPに関するエラーが出ます。 ( No.1 )
名前:T.O 日時:2009/02/15 23:26

VC++のほうでエラーが出る件ですが、自己解決しつつあります。 後のほうのマップ描画の件だけよろしくお願いいたします。
Re: HEAPに関するエラーが出ます。 ( No.2 )
名前:Sim 日時:2009/02/16 02:34

>背景のマップを描画する際、 >32*32ドットぐらいの細かいマップチップを敷き詰めるのと、一枚絵をドカッと描画させるのでは >どちらが動作が軽いでしょうか? 当然一枚絵をドカっと描画させるほうが軽いです。 私は、障害物のようなマップチップでないと表現できない部分はマップチップにして、 それ以外の遠景のような部分は一枚絵をドカッと描画させてます。
Re: HEAPに関するエラーが出ます。 ( No.3 )
名前: 日時:2009/02/16 15:19

>無視して続けても平気だったりしますし メモリ破壊系のエラーは何が起こっても不思議では ありません。つまり、何も起こらなくても、 不思議ではないので、無視してはいけません。 >BorlandC++のほうでは何の異常もなく動きます それはコンパイラによる最適化の方法が違うからです BCCではたまたま、破壊された領域がプログラム内で 使用されていなかったということでしょう。 チップを敷き詰める場合、描画する際は ループを使用するのが一般的です。 一方、一枚絵ならばそんなループは不要ですね。 そういう意味でも、一枚絵を1回だけ出すほうが 早いと思います。 #ただし、あまりに大きな画像だと、 #転送しきれずに遅くなったりするので、 #適度な大きさにしておくほうがよいでしょう。
Re: HEAPに関するエラーが出ます。 ( No.4 )
名前:cave 日時:2009/02/16 18:25

どこでメモリ破壊が起きているのか原因が特定できていれば、その辺をチェックすればいいかと。 あと、VisualStudioなら_Crt系命令が使えるので、特定しやすいですね メモリ上に画像がロードされている状態からの転送を考えると、 GPUのメモリが許すのであれば一枚絵の方が早いです。 ただ、マップのようにタイルで並べて広大な解像度が必要であれば、マップチップを使うのが一般的でしょう。
Re: HEAPに関するエラーが出ます。 ( No.5 )
名前:管理人 日時:2009/02/16 19:58

Simさんや caveさんの補足になりますが、 1枚で表現したほうが処理は軽いですが、必要なメモリ容量はチップ表現よりも多くなります たとえば1チップのサイズが 32x32 として、256種類のチップを組み合わせて 縦横4画面分( 1画面 20x15チップ として 80x60 )の広さを持つステージを表現した場合は チップ画像のサイズ 32 * 32 * 4 * 256 = 1048576バイト = 1メガバイト ( フルカラーの画像は1ドット32ビットなので、4バイト 1メガバイト = 1048576 バイト( 1024 * 1024 ) ) チップマップのサイズ 80 * 60 = 4800バイト = 約5キロバイト ( チップの種類が 256 種類なので、1バイトで表現が可能 ) と、約1メガバイトで表現できますが( 更にチップマップのサイズは小さいので、 ステージが広くなっても1メガバイト強で済みます )、 対して同じ広さのステージを1枚の画像で表現した場合は 80 * 32 * 60 * 32 * 4バイト = 19660800バイト = 18.75メガバイト 約18倍のデータ容量になります( マップが広くなれば差は更に大きくなります ) ( このサイズは読み込む元の画像ファイルがJpeg等で圧縮されていても、読み込んだ時点で 上記計算のサイズになります ) 最近のPCには1ギガバイトや2ギガバイトのメモリが搭載されていたりするので 問題にはならないかもしれませんが、一応気に留めて置いてください
Re: HEAPに関するエラーが出ます。 ( No.6 )
名前:T.O 日時:2009/02/16 21:31

皆様ご回答ありがとうございます。 大変参考になります。 マップチップのは、一枚絵、チップどちらも一長一短があるような感じですが、 マップが広大な場合チップのほうが一般的で、しかもメモリ使用量が少なく済むとお聞きして、 これはマップチップ使用で正解だったと安心できました。 HEAPの件は原因ははっきりとは分からないもののちょっと怪しげなところを直したら、まったくエラーが出なくなりました。 ほっとくとまずいとお聞ききして、苦労して直してよかったと思いました。

Page: 1 |