TStringList.Create→Freeの最適タイミング

解決


*suzu*  2007-03-22 19:52:54  No: 25450

TStringList.Create→Freeの最適タイミングについて、
素朴な疑問です。

いま【FormCreate】内で
  lstA := TStringList.Create ;
を行なっています。
【FormCreate】以外ではCreateしていません。

プログラム内でガンガン使いまくります。

解放するのは【FormClose】で
  lstA.Free ;
を行なっています。

これで問題なくメモリ解放ってされていると思って
大丈夫でしょうか?

Freeしてるんだから大丈夫だろう、、、と思うのですが、
CSVファイルの読み書きしているプログラムで『I/Oエラー:1450』が発生し、
リソース不足になっているので、不安になり質問させていただきました。

ご存知の方、どうぞお教えください...。


deldel  2007-03-22 20:33:25  No: 25451

Closeは実行されない場合がありますので、
CloseQueryがいいかと。


別問題?  2007-03-22 20:58:21  No: 25452

>リソース不足になっているので、不安になり質問させていただきました。
リソース不足とメモリリークとはチョット違うけど、そのリソース不足の原因は
StringListとは別のところにあると思う。


*suzu*  2007-03-22 22:28:49  No: 25453

*suzu*です。
deldelさん、別問題?さん、
ご返信ありがとうございますm(_ _ )m

●deldelさん
ご回答ありがとうございます。
さっそくFreeしているところを
【FormClose】から【FormCloseQuery】へ移動してみます。

●別問題?さん
>リソース不足とメモリリークとはチョット違うけど
(;^ω^)違うんですか...    ぁあ、恥ずかしい...
StringListとは別のところですか...
ぅーん...
まずは、リソース不足とメモリリークの違いを確認してから
出直します...


  2007-03-23 21:15:29  No: 25454

FormCloseQuery内で問題ないと思いますが、
CanCloseを操作する可能性があるならば
デストラクタをオーバーライドしてそこに
書き込めば良いのではないでしょうか。


たんに  2007-03-24 00:25:25  No: 25455

OnDestroy でよいかと


さどやま  URL  2007-03-24 22:16:54  No: 25456

質問の趣旨は次のとおりで良いのでしょうか。

①  『I/Oエラー:1450』(ERROR_NO_SYSTEM_RESOURCES)が発生した。
②  メモリリークバグがあると思った。
③  メモリリークを起こすとしたらTStringListしか見当たらない。
④  TStringList.Create, Freeの処理に問題は無いと思うが、
    他に原因が見当たらないのでTStringListの処理は本当によいか確認したい。

  Win2000/XPでも、メモリリークバグでリソース不足を起こすことは簡単ですが、システムリソースはWindowsのバージョンで仕様が異なりますので、その情報もほしいところです。

  なお、FormCreate でのみCreateしたオブジェクトの開放は、私も「OnDestroy」で十分だと思うのですが、場合によっては何か問題が起こりうるのでしょうか。


*suzu*  2007-03-26 18:52:34  No: 25457

*suzu*です。お世話になります。

●邪さん
ご回答、ありがとうございます。
【CanClose】は使っていないので、
【OnCloseQuery】内で問題なさそうですが、
他にご意見いただいた【OnDestroy】もよさそうでした☆

●たんにさん
【OnDestroy】というイベントがあるのは、
初めて知りました(;^ω^)
他のプログラムも見直してみたら【OnCloseQuery】で
破棄関係の処理をしていました。
ただヘルプを見た感じ【OnDestroy】で
行なったほうがよさそうですね。

●さどやまさん
>質問の趣旨は次のとおりで良いのでしょうか。
仰るとおりですm(_ _ )m

『I/Oエラー:1450』が発生した環境は、Win2003Serverです。
Delphi5(Up1)で、作ったプログラムです。
データベースは...  関係ないですね((((;><)

邪さん、たんにさん、さどやまさん。
ご返信、ありがとうございました。


*suzu*  2007-03-26 20:48:09  No: 25458

*suzu*です。補足させて下さい。

当該プログラムで行なっている処理ですが...

  1)ネットワーク上の別サーバのネットワークドライブから、
    そこに格納されているCSVファイルをOpenし、Readする
  2)読み込んだデータをデータベース(Oracle9i)へ書込む
  3)1へ戻る

ひたすら1),2),3)のくり返しです。
サーバ上で動作させているので、
サーバの再起動を行なわないか、
エラーにでもならない限り
当該プログラムが終了することはありません...。

TStringListをCreateしている箇所は、
FormCreateだけでした。

さどやまさんからのお返事に『ERROR_NO_SYSTEM_RESOURCES』とあり
ググったらいろいろヒットし、TStringListの解放云々以外も不安になったので、
補足説明させていただきました。
『I/Oファイルのサイズが大きいとエラーとなる場合もある』
というような情報もあったのですが、
プログラムで読み込んでいるファイルは、殆ど1KB程度のファイルです。
読み込むファイルの数は200ファイル程度です。

問題ありそうですか...?


さどやま  URL  2007-03-26 21:43:14  No: 25459

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*  2007-03-26 23:53:16  No: 25460

*suzu*です。お世話になります。

さどやまさん、ありがとうございますm(_ _ )m
otn・MSDNのURL、拝見しました。
疑うところがたくさんあって、困ります(;´Д`)
こちらの内容でも確認してみます。

あと、
>原因の特定にはなりませんが、原因からの排除の一つとして、システムメモリを増やしてみるのもよいでしょう。
https://www.petitmonte.com/bbs/answers?question_id=4645
の箇所のURLは、このスレッドがリンクされていたのですが...
他に参考になるようなスレッドがありますでしょうか?
あるようでしたら、お教えください。

では、失礼致します。


さどやま  2007-03-27 01:11:50  No: 25461

アドレスミス失礼しました
http://blog.goo.ne.jp/error110/e/5522fe6379790af8c9e24ccd7bb205dd


*suzu*  2007-04-03 02:07:44  No: 25462

*suzu*です。お世話になります。

●さどやまさん
  ありがとうございました。
  システムメモリは...多分変更(増やしたり...)できないかもしれないので...。
  他のメインシステムのパソコンに相乗りしている状態ですので。

とりあえず、いまのところエラーも発生していませんので、
また様子を見ることにします。

TStringList.Freeは【OnCloseQuery】で行なうようにしてみました。

ありがとうございましたm(_ _ )m


*suzu*  2007-04-03 02:08:34  No: 25463

・:*:・・:*:・解決チェック・:*:・・:*:・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加