在我的 Delphi XE2 32 位应用程序 (Update 4 Hotfix 1 Version 16.0.4504.48759) 中,我使用 Format() 例程来记录指针值。
例如:
Format('MyObject (%p)', [Pointer(MyObject)]);
但是,生成的字符串有时包含垃圾字符(例如,在这种情况下,“?”或“|”代替十六进制数字):
MyObject (4E?|2010)
当用 '%x' 替换 '%p' 时,我也会得到相同的结果,如下所示:
Format('MyObject (%x)', [Integer(MyObject)]);
但是,使用整数值总是有效的:
Format('MyObject (%d)', [Integer(MyObject)]);
MyObject (1291453120)
是否有我不知道的错误,或者这可能与这里遇到的问题有关?
为什么将“%s”以外的任何内容与 Variant 一起使用时,Format 会崩溃?
更新
我接受了 Jeroen 的回答,因为它通过消除过程引导我找到了解决方案。在通过 F7 启动应用程序的情况之后(根据评论),我认为在此过程的早期一定会出现问题。凭直觉,我从它的 IDE 菜单中禁用了 madExcept,重新构建了应用程序,问题就消失了。显然,madExcept 链接到我的应用程序的任何代码都会导致 SysUtils 常量 TwoHexLookup 被覆盖。重新启用 madExcept 和重建(我没有任何其他更改)也有效,因此在链接阶段肯定存在一些损坏。
Jeroen 概述的用于检测内存损坏的策略是一个有用的练习,如果我遇到类似的情况应该证明是有价值的。