【发布时间】:2014-01-24 20:45:30
【问题描述】:
我在调试一个项目时遇到此错误,该项目曾经是在 Delphi 7 中,我一直在升级到 Delphi XE2,同样的错误发生在几个方法中。
First chance exception at $006DC660. Exception class $C0000005 with message 'access violation at 0x006dc660 read of address 0xffffffff'
这是其中一种方法:
PFI = ^TFI;
TFI = record
Id : TToken;
Name : TName;
Parameters : string;
end;
function TListFI.IsIn(S: PChar): PFI;
function SearchName2(Item: PFI):Boolean;
var N1, N2: PChar;
begin
N1:= StrNew(Item^.Name);
N2:= StrNew(S); //Here is the issue
SearchName2:= (StrComp(StrUpper(N1), StrUpper(N2)) = 0);
StrDispose(N1);
StrDispose(N2);
end;
begin
IsIn:= PFI(FirstThat(@SearchName2));
end;
我用谷歌搜索过,我发现有人描述了类似的问题,他确认当增量链接器被禁用时它可以工作,有人可以告诉我它是什么和在哪里,或者提供一些解决这种情况的建议。
[编辑]
现在删除 @ 会给我在 IsIn:= PFI(FirstThat(SearchName2)); 中出现以下错误
E2010 Incompatible types: 'TObject' and 'PFI'
我正在添加 FirstThat 程序,看看它是否有帮助。
TFuncionColeccion = function (Elemento: TObject): Boolean;
function TColeccion.FirstThat (Rutina: TFuncionColeccion): TObject;
var
i: Integer;
begin
For i:=0 to Count-1 do
if Rutina(Items[i]) then
begin
FirstThat:=Items[i];
exit;
end;
FirstThat:=nil;
end;
【问题讨论】:
-
是什么促使您使用
StrNew?我将采取的第一步是将其从我的代码库中删除。 -
我收到了这个项目,它已经在几个学生的手中(我也是一个)。什么可以使用 insted 以及为什么要删除它?我会添加地址。
-
空终止字符串的堆分配需要仔细的内存管理。您的代码错过了必要的 try/finally 循环以防止泄漏。在今天的 Delphi 中,您将使用
string。你可以通过简单的赋值将PAnsiChar和PWideChar直接转换为string, -
@sandiego - 对我来说,指针和托管类型在同一个记录声明中的混合表明作者并不真正知道他们在做什么。如果我是你,我会考虑重构代码并完全删除显式指针使用 -
StrNew和朋友是 1996 年在 Delphi 2 中引入的堆管理string类型的相当糟糕的前身。哪里有仍然有理由在适当的时候使用PChar类型,其中不会是当您只想对两个字符串进行不区分大小写的比较时。 -
我还在为这个问题苦苦挣扎,问题已编辑,但如果不是问题,谁能解释我为什么原始功能在 Delphi 7 上工作,但在 Delphi XE2 中我遇到了这个问题?跨度>
标签: delphi exception delphi-xe2 access-violation