掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
New(P)を使ったあとの解放方法は? (ID:25337)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
お世話になります。環境はWindows XP Pro Delphi 6 Personalです。 質問1:素人が作成したプログラムだからメモリーリークがあるだろ〜な〜とは考えていましたが、ふとしたきっかけでメモリーリークをチェックできるソフトを下記のサイトで見つけました。 そこで実行してみると2700個(TreeViewの要素数と同じ)くらいチェックに引っかかり仰天しました。下記のNew()を外すとほぼ0になります。 コードはお気に入りをテキストファイルに保存していて、それを起動時にTreeViewにロードするとき発生するのが判りました。 ヘルプにNew()を使ったらDispose()で解放することと書いてありましたから、適当と考えられる場所にいれるとリークは0になりますが TreeViewのNodeのURLが空白で入るようでうまくいきません。 TreeViewに要素名+URLを登録するサイトは散見するのですがDisposeを書いてあるのを見かけません。不要なのでしょうか? 質問2:以前この掲示板には過去ログ検索が合ったような気がするのですが見あたりません。ブラウザがおかしいのかといろいろ試しました。なぜ無くなったのでしょうか?大変お世話になっていたので残念です。 よろしくお願いします。 TOBY SOFT wiki の Delphi メモリーリークをチェックするの HeapChecker http://tobysoft.net/wiki/index.php?Delphi%2F%A5%E1%A5%E2%A5%EA%A5%EA%A1%BC%A5%AF%A4%F2%A5%C1%A5%A7%A5%C3%A5%AF%A4%B9%A4%EB type PBookMarkItem = ^TBookMarkItem; TBookMarkItem = record URL:string; end; ・・・・ var P:PBookMarkItem; Node:TTreeNode; StringListNode, strList :TStringList; begin ・・・・ //お気に入りテキストファイルをロードする 構造 "level","要素名","http://......URL" StringListNode.LoadFromFile(AppPath+'ScrapbookData\_ScrapBookSystem\IEFavorites.txt'); OldLevel := 0; //integer Node := nil; // for i := 0 to StringListNode.Count -1 do begin StrList.CommaText := StringListNode.Strings[i]; NewLevel := StrToInt(StrList.Strings[0]) ; //レベル strTitle := StrList.Strings[1]; //項目名 New(P); P^.URL := StrList.Strings[2]; //URL Node := formMDI.TreeView1.Items.AddObject(Node,strTitle,P) if OldLevel > NewLevel then begin OldLevel := NewLevel; while Node.Level > NewLevel do begin Node.MoveTo(Node.Parent,naAdd); end; end else begin if OldLevel < NewLevel then //子にする begin Node.MoveTo(Node.GetPrev,naAddChild); OldLevel := NewLevel; end; end; Dispose(P);//・・・・・・・・・此処に入れてみましたがURLがクリアーされるみたい end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.