いつもDXライブラリに大変お世話になっております。
CreateGraphFromMemで特定のPNGファイルを複数読込したとき、
まれに強制終了する現象を確認しましたのでご報告します。
使用させていただいたDXライブラリはバージョン「3.24」です。
環境依存かもしれませんが、以下の再現ソースで作成したexeを何度も実行し直すと、
10〜20回に1度くらいの頻度でアクセス違反で強制終了するようです。
その際、呼び出し履歴を見ると「LoadPngImage_Fast」という関数でアクセス違反が発生しているようでした。
よければ一度ご確認いただけますと幸いです。
※VisualStudio Community 2022でコンパイルし、Debug、Release版どちらでも再現しました。
※Windows SDKのgflagsを使って「gflags.exe /p /enable D:\(絶対パス)\Test.exe /full /tracedb 24」
(Test.exe=作成したEXE)と実行すると「icon100.png」の読み込みで確実にエラーが再現できました。
<再現に使用したPNGファイル>
[---削除させていただきました---]
上記のZipファイルには、「icons」フォルダの中に「icon096.png〜icon190.png」が入っています。
icon96〜99は正常に読み込めていることを確認するための問題のないPNGファイルで、
icon100.png以降の読み込みからまれにアクセス違反が発生します。
gflagsなしだと、問題が発生するicon番号の場所はランダムです。
(icon100以降がどういう方法で作られたものかは不明ですが、
素材サイトで配布されているデータです)
<こちらの環境のLog.txt>
[---削除させていただきました---]
<再現ソース>
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE) ; // ウィンドウモードに
if( DxLib_Init() == -1 ){ return -1;} // DXライブラリ初期化処理
int fPt;
unsigned char *Data;
int grHandle;
char filename[256];
for (int i = 96; i < 191; i++) { // icon96〜190.pngを読込、こちらの環境ではicon100から問題が起きます
sprintf(filename, "icons/icon%03d.png",i);
fPt = FileRead_open(filename);
int Size = FileRead_size(filename);
Data = new unsigned char[Size];
FileRead_read(Data, Size, fPt);
grHandle = CreateGraphFromMem(Data, Size);//←エラーが起きる場合はここでアクセス違反が発生します
delete[] Data;
FileRead_close(fPt);
}
// すぐ終了。90%くらいの確率で正常に終了してしまうので、その場合は何度も立ち上げ直してみてください
DxLib_End();
return 0 ; // ソフトの終了
}