トップページ > 記事閲覧
FileRead_open関数におけるメモリリークについて
名前:・∀・ 日時: 2020/05/03 18:48

平素はDxLibの開発・管理をくださいましてありがとうございます。・∀・と申します。 DxLibにおいてメモリリークバグのを見つけた…かもしれませんので、こちらで報告します。 下記の状況でFileRead_Open関数を使用すると、手元環境では1ファイルごとに3.250kBのメモリリークが発生しました。 DxLibのバージョンは少し古いですが、「3.19d」です。非同期読み込みの設定が二重に行われていることが原因かもしれません…。  DxLib::SetUseASyncLoadFlag(TRUE);  hoge = DxLib::FileRead_open("fileName", TRUE);  DxLib::FileRead_close(hoge); _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);によるメモリダンプは下記のとおりです。 ログ出力時は合計6つのテキスト/バイナリデータをFileRead_open()にて読み込んでいます。 3570:Alloc memory dump 3572: size: 3328(3.250kb) user size: 3208(3.133kb) time:61950 file:y\Main\DxFile.cpp line:6763 ID:109 addr:092c2640 data:[00 00 00 00 00 00 00 00 8a 00 00 00 00 00 00 00] 3573: size: 3328(3.250kb) user size: 3208(3.133kb) time:61950 file:y\Main\DxFile.cpp line:6763 ID:155 addr:092c3560 data:[00 00 00 00 00 00 00 00 52 01 00 00 00 00 00 00] 3574: size: 3328(3.250kb) user size: 3208(3.133kb) time:61950 file:y\Main\DxFile.cpp line:6763 ID:176 addr:092c4260 data:[00 00 00 00 00 00 00 00 89 06 00 00 00 00 00 00] 3575: size: 3328(3.250kb) user size: 3208(3.133kb) time:61950 file:y\Main\DxFile.cpp line:6763 ID:248 addr:092c53b0 data:[00 00 00 00 00 00 00 00 2e 1d 00 00 00 00 00 00] 3576: size: 3328(3.250kb) user size: 3208(3.133kb) time:61950 file:y\Main\DxFile.cpp line:6763 ID:294 addr:092c7360 data:[00 00 00 00 00 00 00 00 d3 46 0e 00 00 00 00 00] 3576: size: 3328(3.250kb) user size: 3208(3.133kb) time:61950 file:y\Main\DxFile.cpp line:6763 ID:365 addr:092cc2d0 data:[00 00 00 00 00 00 00 00 fc 00 00 00 00 00 00 00] 3577: Total size:19248(18.797kb) Alloc num:6 ※データは1行の長さの都合上空白の調整及び途中改行を行っています。 本件お時間のある際にご確認くださいますと幸いです。何卒よろしくお願いいたします。
メンテ

Page: 1 |

Re: FileRead_open関数におけるメモリリークについて ( No.1 )
名前:管理人 日時:2020/05/03 22:01

FileRead_open の前に SetUseASyncLoadFlag(TRUE); を実行されているのがメモリリークの原因です SetUseASyncLoadFlag(TRUE); で非同期読み込みを有効にした状態では FileRead_open の 直後は『ファイルオープンを非同期で行っている状態』なので、直後に FileRead_close を 実行しても『非同期処理中なのでエラー』となり、FileRead_close の処理は行われません そのためファイルがオープンされたままプログラムを終了するとメモリリークとなってしまう、 という仕組みです なので、SetUseASyncLoadFlag(TRUE); を実行して非同期読み込みを有効にしている場合は CheckHandleASyncLoad の戻り値が TRUE の間( 非同期処理を行っている間 )は同ハンドルに 対して次の処理を行わないようにしてください m(_ _)m  DxLib::SetUseASyncLoadFlag(TRUE);  hoge = DxLib::FileRead_open("fileName", TRUE); // 非同期処理終了待ちを行う while( CheckHandleASyncLoad(hoge) == TRUE && ProcessMessage() == 0 ) { Sleep(1); }  DxLib::FileRead_close(hoge);
メンテ
Re: FileRead_open関数におけるメモリリークについて ( No.2 )
名前:にこよう 日時:2020/05/04 12:43

横からすみません 私のDxLibのログにも同じような表記があるのですが、これらの表記は全てメモリリークしたことを表しているのでしょうか? 今まで何かのデバッグの為にダンプされたものと思っており、無視していました... 58588: Total size:80(0.078kb) Alloc num:10
メンテ
Re: FileRead_open関数におけるメモリリークについて ( No.3 )
名前:・∀・ 日時:2020/05/06 00:59

>管理人 様 ご返答ありがとうございます。すいません、私の説明不足なところがありました。 本状況ですが、使用する前にご指摘通り読み込み完了を待つ処理を入れております。 改めて実験したところ、バージョン"3.19d"で下記コードにて再現確認ができましたのでご連絡します。 なお手元に持っていた過去バージョン"3.10e"では、同様のコードでも本メモリリークは再現しませんでした。 ※メモリダンプ出力はDxLibの出力のほうで、_CrtSetDbgFlag()によるものではありませんでした。失礼いたしました。 #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } SetUseASyncLoadFlag(TRUE); int hoge = FileRead_open("main.cpp", TRUE); // int hoge = FileRead_open("main.cpp"); だとメモリリークは発生しない while (GetASyncLoadNum() > 0 && ProcessMessage() == 0){ Sleep(1); } FileRead_close(hoge); DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 } [メモリダンプ出力] 1649:Alloc memory dump 1651: size: 3328(3.250kb) user size: 3208(3.133kb) time:60288 file:y\Main\DxFile.cpp line:6763 ID:57 addr:095223f0 data:[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00] 1652: Total size:3208(3.133kb) Alloc num:1 [参考] FileRead_open関数のSyncFlagに関しては、過去に以下のスレッドがありました:  「FileRead_openの非同期読み込み時の引数に関して」dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=3652 恐れ入りますが、よろしくお願いいたします。 > にこよう 様 ここに出力されるメモリダンプは、DXライブラリにて解放し忘れたオブジェクトがあるときなどに記録されたものだったと記憶しています。 例えば、MakeScreen()関数で生成した画像ハンドルを、DeleteGraph()関数で削除し忘れたときにここにデータが出るはずです。
メンテ
Re: FileRead_open関数におけるメモリリークについて ( No.4 )
名前:にこよう 日時:2020/05/06 01:05

>・∀・様 ご回答ありがとうございます 解放が必要な関数系は全て開放しているつもりだったのですが10件も... 探して修正しようと思います
メンテ
Re: FileRead_open関数におけるメモリリークについて ( No.5 )
名前:管理人 日時:2020/05/06 01:53

> にこようさん > 私のDxLibのログにも同じような表記があるのですが、これらの表記は全てメモリリークしたことを表しているのでしょうか? はい、・∀・さんが仰られています通りメモリリークしていることを表しています > ・∀・さん すみません、FileRead_open の第二引数が TRUE になっていることを見落としていました FileRead_open の第二引数を TRUE にしてもメモリリークしないように修正したバージョンを アップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 因みに「FileRead_openの非同期読み込み時の引数に関して」のスレッドにもあります通り FileRead_open の第二引数を TRUE にする方の非同期読み込み処理は SetUseASyncLoadFlag( TRUE ); の非同期読み込み処理よりも前に実装された機能なので、どちらの方がお勧めかといえば SetUseASyncLoadFlag( TRUE ); による非同期読み込み処理です ( そして FileRead_open の第二引数を TRUE にしつつ SetUseASyncLoadFlag( TRUE ); も使う ということも可能ですが、二重で非同期読み込みの処理が実行されるので非効率( 読み込み時間が 長くなる上に CheckHandleASyncLoad と FileRead_idle_chk どちらも使用する必要がある )です )
メンテ
Re: FileRead_open関数におけるメモリリークについて ( No.6 )
名前:・∀・(解決) 日時:2020/05/07 22:57

> 管理人 様 ライブラリの修正の方、ありがとうございます。 手元環境でもメモリリークしないことを確認することができました。 併せて、ファイルの非同期読み込みに関する知見も広げることができました。 丁寧にご対応くださいまして、誠にありがとうございました。 今後ともどうぞよろしくお願いいたします。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存