作成中のプログラムがメモリリークしてまして、コードとヘルプと本とを見直して
ましたら、どうも、動的配列が原因のようです。
間違っていたら教えてほしいのですが、動的配列はそれを破棄するコードを記述し
ないと、いつまでもメモリ上に存在するのですよね?。
そこで動的配列を破棄するコードを書こうと思ったのですがヘルプを見ると、
「動的配列の割り当てを解除するには,配列を参照する変数に nil を代入するか,
Finalize に変数を渡します。」
としか書かれていません。
記述例もありません。(探せてないだけか?)
この一行の説明では私のスキルではコードが書けません。
どうか、動的配列をメモリから破棄する方法をサンプルコードをふまえて教えて
ください。
どうぞ、よろしくお願いいたします。
> この一行の説明では私のスキルではコードが書けません。
十分説明されていると思いますけど…。
要するにnilを代入すればいいだけですよね?(variable := nil)
でもたしか、配列ってわざわざ破棄しなくてもよかったような…。(少なくとも静的配列は)
スコープを抜けた時点で自動的に破棄される(されないのはオブジェクト型変数だけ)だと思いますけど。
見逃してただけかな…。
MemCheckユニットの、スタックトレース機能は使ってみましたか?
無理な場合もありますけど、メモリリークの場所が特定できる場合がありますよ。
(ところで、リストなら、TList,TStringListを継承したクラスを使ったほうが楽ですよ)
>十分説明されていると思いますけど…。
すいません。
やはり良く解りません。
MemCheckユニットも使い方がよく解りません。
私にはこの掲示板はまだ、レベルが高すぎるようです。
勉強し直してきます。
ド素人に御付き合いくださり、ありがとうございました。
解決になっていますが、そうではない様なので参考までに書き込みます。
MemChekの使い方が解らないのに、
本当にメモリリークしていると判断できましたか?
メモリリークは終了時に、使用したメモリーを解放していない事で、
実行中に大量消費している場合は、ロジックの問題です。
1つ前の質問に関連していると思いますが
0.2秒毎に変数に追加すればメモリーを消費するのは当然です
(文字サイズにもよりますが)
質問の答えは、たかみさんが書かれていますが
String変数='' 動的配列=nil で開放します
ボタンを1つ追加して、全ての変数を初期化(’’やnilを代入)するコードを書いて
適当な所で実行してみてください。
消費メモリーが減少すれば、正常です。
監視追加したログをどのように使うか解りませんが
サイズが大きくなる場合はファイルに書き込んだほうが良いと思います。
又、時間経過で不要になった分を、削除すればメモリー消費を一定に保てます。
Taku さん。助言ありがとうございます。
MemChekの使い方は、やはり、よく解かりません。
動的配列の初期化はなんとか解かりました。(「nil」という単語そのものを
代入するのですね。「ヌル」を代入、、かと勘違ってました)
ソフトの挙動やメモリの増えるタイミング、初期化のテストなどで疑わしい
箇所が絞れて来ました。本当にメモリリークか否かは断定できませんが、
疑わしい箇所をクラス化して試してみようと、今、コードをガリガリ書いて
います。
クラスだと使用後必ずFreeするから、メモリが開放されますよね。。
それで確かめてみようと考えました。
ちなみにあつかう文字列は、最大時で10,000バイトです。
ファイルへの書き出しも勉強中です。
> MemChekの使い方は、やはり、よく解かりません。
ん、簡単に使うのなら、プロジェクトソース(プロジェクトツリーのプロジェクトの上で右クリックメニュー>ソースを表示)で、
uses節の一番上にMemCheckという文字を書き込むだけですけど。
"ファイルが見つからない"といわれるのなら、MemCheckユニットがパスの通ったフォルダにないから。
ユニット専用フォルダをつくり、そこを"ツール>環境オプション>ライブラリパスに登録"
(初期状態の二つのフォルダに入れると、後できっと困ります)
その辺の開発環境の操作方法は、Delphiのヘルプに載っています。
Delphiのヘルプは環境依存ヘルプ(ダイアログのヘルプボタンを押すと、ヘルプのそのページが開く)ですから、迷うことはないでしょう。
スタックトレース機能の使い方は、MemCheckの公開ページにありますけど、
操作方法についてわからないところは、ほとんどDelphiのヘルプにのっているはずです。
ツイート | ![]() |