Imが作成セクションに次のコードデルファイアクセス違反読書オブジェクトは
var
List: TStrings;
と、次の
Access violation at address 00404340 in module 'test.exe'. Read of address FFFFFFD5
を取得します:
Result := List.AddObject('hi', aCreatedObject);
MessageDlg(FunctionHookList.Objects[Result].ClassName, mtInformation, [mbOK], 0);
メッセージダイアログが正しいクラス名
を示ししかし、その後、私が行うとき、
i := list.IndexOf('hi');
if i >= 0 then
if list.Objects[i] <> nil then
if assigned(list.Objects[i]) then
begin
tmp := list.Objects[i];
if tmp <> nil then
MessageDlg(tmp.ClassName, mtInformation, [mbOK], 0); //*******
end;
私は//*******
ライン
上で、上記のアクセス違反を取得し、私が知っていますそこに重複したコードが少しありましたが、私は「すべて」をチェックしようとしていました
「後で」と言ったらどういう意味ですか?おそらく、aCreatedObjectがその時点で破棄され、list.Objects [i]が無効なオブジェクトを返すことがあります。変数宣言を含む完全な関数の中に例を投稿してください。 – Ozan
インデックスiのオブジェクトがnilの場合はコードが2回、割り当てられている場合は1回チェックされます。 Objects [i]をtmpに一度割り当て、tmp: 'if i> = 0をチェックしてtmp:= Objects [i]を開始することができます。もしAssigned(tmp)then ... ... ' – mjn
@Ozan、aCreatedObjectが破壊されている可能性があります。私は '<> nil'と' assigned'の使用がそれを捕まえると思っていました。 –