我一直在使用 DUnit 作为 TDD 驱动程序在 Delphi 5 中开发一些软件,但我发现当使用 CheckEqualsMem 时它一直失败,即使在调试器中我可以看到正在比较的对象(在这种情况下是两个长字数组)是完全相同的。
在内部,CheckEqualsMem 使用 CompareMem 并发现这是返回错误的内容。
深入研究我发现,如果我使用 @ 或 Addr CompareMem 使用指向对象地址的指针调用 CompareMem,即使内存相同,也会失败,但如果我使用 PByte(来自 Windows)或 PChar,它将正确比较内存.
为什么?
这是一个例子
var
s1 : String;
s2 : String;
begin
s1 := 'test';
s2 := 'tesx';
// This correctly compares the first byte and does not return false
// since both strings have in their first position
if CompareMem(PByte(s1), PByte(s2), 1) = False then
Assert(False, 'Memory not equal');
// This however fails ?? What I think I am doing is passing a pointer
// to the address of the memory where the variable is and telling CompareMem
// to compare the first byte, but I must be misunderstanding something
if CompareMem(@s1,@s2,1) = False then
Assert(False,'Memory not equal');
// Using this syntax correctly fails when the objects are different in memory
// in this case the 4th byte is not equal between the strings and CompareMem
// now correctly fails
if CompareMem(PByte(s1),PByte(s2),4) = False then
Assert(False, 'Memory not equal');
end;
正如您在评论中看到的,我来自 C 背景,所以我认为 @s1 是指向 s1 的第一个字节的指针,而 PByte(s1) 应该是同一件事,但事实并非如此。
我在这里有什么误解?@/Addr 和 PByte 有什么区别??