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
|
Re: FileRead_open関数におけるメモリリークについて ( No.6 ) |
- 名前:・∀・(解決) 日時:2020/05/07 22:57
> 管理人 様
ライブラリの修正の方、ありがとうございます。
手元環境でもメモリリークしないことを確認することができました。
併せて、ファイルの非同期読み込みに関する知見も広げることができました。
丁寧にご対応くださいまして、誠にありがとうございました。
今後ともどうぞよろしくお願いいたします。
|