TStringList.Create→Freeの最適タイミングについて、
素朴な疑問です。
いま【FormCreate】内で
lstA := TStringList.Create ;
を行なっています。
【FormCreate】以外ではCreateしていません。
プログラム内でガンガン使いまくります。
解放するのは【FormClose】で
lstA.Free ;
を行なっています。
これで問題なくメモリ解放ってされていると思って
大丈夫でしょうか?
Freeしてるんだから大丈夫だろう、、、と思うのですが、
CSVファイルの読み書きしているプログラムで『I/Oエラー:1450』が発生し、
リソース不足になっているので、不安になり質問させていただきました。
ご存知の方、どうぞお教えください...。
Closeは実行されない場合がありますので、
CloseQueryがいいかと。
>リソース不足になっているので、不安になり質問させていただきました。
リソース不足とメモリリークとはチョット違うけど、そのリソース不足の原因は
StringListとは別のところにあると思う。
*suzu*です。
deldelさん、別問題?さん、
ご返信ありがとうございますm(_ _ )m
●deldelさん
ご回答ありがとうございます。
さっそくFreeしているところを
【FormClose】から【FormCloseQuery】へ移動してみます。
●別問題?さん
>リソース不足とメモリリークとはチョット違うけど
(;^ω^)違うんですか... ぁあ、恥ずかしい...
StringListとは別のところですか...
ぅーん...
まずは、リソース不足とメモリリークの違いを確認してから
出直します...
FormCloseQuery内で問題ないと思いますが、
CanCloseを操作する可能性があるならば
デストラクタをオーバーライドしてそこに
書き込めば良いのではないでしょうか。
OnDestroy でよいかと
質問の趣旨は次のとおりで良いのでしょうか。
① 『I/Oエラー:1450』(ERROR_NO_SYSTEM_RESOURCES)が発生した。
② メモリリークバグがあると思った。
③ メモリリークを起こすとしたらTStringListしか見当たらない。
④ TStringList.Create, Freeの処理に問題は無いと思うが、
他に原因が見当たらないのでTStringListの処理は本当によいか確認したい。
Win2000/XPでも、メモリリークバグでリソース不足を起こすことは簡単ですが、システムリソースはWindowsのバージョンで仕様が異なりますので、その情報もほしいところです。
なお、FormCreate でのみCreateしたオブジェクトの開放は、私も「OnDestroy」で十分だと思うのですが、場合によっては何か問題が起こりうるのでしょうか。
*suzu*です。お世話になります。
●邪さん
ご回答、ありがとうございます。
【CanClose】は使っていないので、
【OnCloseQuery】内で問題なさそうですが、
他にご意見いただいた【OnDestroy】もよさそうでした☆
●たんにさん
【OnDestroy】というイベントがあるのは、
初めて知りました(;^ω^)
他のプログラムも見直してみたら【OnCloseQuery】で
破棄関係の処理をしていました。
ただヘルプを見た感じ【OnDestroy】で
行なったほうがよさそうですね。
●さどやまさん
>質問の趣旨は次のとおりで良いのでしょうか。
仰るとおりですm(_ _ )m
『I/Oエラー:1450』が発生した環境は、Win2003Serverです。
Delphi5(Up1)で、作ったプログラムです。
データベースは... 関係ないですね((((;><)
邪さん、たんにさん、さどやまさん。
ご返信、ありがとうございました。
*suzu*です。補足させて下さい。
当該プログラムで行なっている処理ですが...
1)ネットワーク上の別サーバのネットワークドライブから、
そこに格納されているCSVファイルをOpenし、Readする
2)読み込んだデータをデータベース(Oracle9i)へ書込む
3)1へ戻る
ひたすら1),2),3)のくり返しです。
サーバ上で動作させているので、
サーバの再起動を行なわないか、
エラーにでもならない限り
当該プログラムが終了することはありません...。
TStringListをCreateしている箇所は、
FormCreateだけでした。
さどやまさんからのお返事に『ERROR_NO_SYSTEM_RESOURCES』とあり
ググったらいろいろヒットし、TStringListの解放云々以外も不安になったので、
補足説明させていただきました。
『I/Oファイルのサイズが大きいとエラーとなる場合もある』
というような情報もあったのですが、
プログラムで読み込んでいるファイルは、殆ど1KB程度のファイルです。
読み込むファイルの数は200ファイル程度です。
問題ありそうですか...?
TStringListの開放は問題ないと思います。
FormClose が実行されないのは、エンドユーザがWindowsを突然シャットダウンした場合だけだと思うのですが。
そうであれば解放も何もない。Windowsもすべて解放されてしまいます。
保存すべきデータがあるのなら CloseQuery でシャットダウンを待ってもらう必要がありますが。
仮にTStringListにメモリリークがあったとしても、それがシステムリソース不足に繋がるのでしょうか。通常のメモリを食うだけであれば仮想メモリも使えるわけで、固まることはあってもエラーにはならないかと。
メモリリークでシステムリソース不足を起こすとすればグラフィック関係のGDIオブジェクトくらいではないかと。
これは、メモリ量ではなく、GDIの数で制限(16384)がありますから、TBitmapなどをforループなどで威勢良く作っていくと、リソースメモリが十分に残っていてもリソース不足エラーになります。
タスクマネージャを見ると、ハンドル数、スレッド数、Userオブジェクト数(何のことか私には解らない)等が表示可能ですので、これらにも何か制限があるのかもしれません。
Windows2000以降についてはシステムリソースの情報が少なく、こういう場合には原因が特定できなくて困ります。
原因の特定にはなりませんが、原因からの排除の一つとして、システムメモリを増やしてみるのもよいでしょう。
https://www.petitmonte.com/bbs/answers?question_id=4645
> Oracle9i
http://otn.oracle.co.jp/forum/message.jspa?messageID=6036760
ここにもSOSが出ています。
SQL に関してはMSDN でも
http://support.microsoft.com/kb/274310/ja
*suzu*です。お世話になります。
さどやまさん、ありがとうございますm(_ _ )m
otn・MSDNのURL、拝見しました。
疑うところがたくさんあって、困ります(;´Д`)
こちらの内容でも確認してみます。
あと、
>原因の特定にはなりませんが、原因からの排除の一つとして、システムメモリを増やしてみるのもよいでしょう。
https://www.petitmonte.com/bbs/answers?question_id=4645
の箇所のURLは、このスレッドがリンクされていたのですが...
他に参考になるようなスレッドがありますでしょうか?
あるようでしたら、お教えください。
では、失礼致します。
アドレスミス失礼しました
http://blog.goo.ne.jp/error110/e/5522fe6379790af8c9e24ccd7bb205dd
*suzu*です。お世話になります。
●さどやまさん
ありがとうございました。
システムメモリは...多分変更(増やしたり...)できないかもしれないので...。
他のメインシステムのパソコンに相乗りしている状態ですので。
とりあえず、いまのところエラーも発生していませんので、
また様子を見ることにします。
TStringList.Freeは【OnCloseQuery】で行なうようにしてみました。
ありがとうございましたm(_ _ )m
・:*:・・:*:・解決チェック・:*:・・:*:・
ツイート | ![]() |