即時得到以下德爾福訪問衝突讀取對象從TStringsList
Access violation at address 00404340 in module 'test.exe'. Read of address FFFFFFD5
用下面的代碼
var
List: TStrings;
在創建科:
List:= TStringList.Create;
添加到列表:
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 2010-11-18 05:39:01
如果索引i處的對象爲零,則您的代碼會檢查兩次,如果指定了對象,則檢查兩次。您可以將Objects [i]分配給tmp一次,然後檢查tmp:'if i> = 0,然後開始tmp:= Objects [i];如果分配了(tmp),那麼...' – mjn 2010-11-18 08:10:35
@Ozan,可能是aCreatedObject可能已經被銷燬,我認爲如果是的話,我過度使用'<> nil'和'assigned'就會捕獲它。 – 2010-11-18 23:26:46