即时得到以下德尔福访问冲突读取对象从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