我有一些代码在 Delphi 2007 下运行良好,但在 D2010 下中断。它涉及传入一个字符串,将其转换为 PWideChar(特别是 WideString 指针,而不是 UnicodeString 指针),进行一些处理,然后在其上调用 SysFreeString。它工作正常,直到传入一个空白字符串,然后 SysFreeString 中断。它调用了一堆最终Int 3
在 NTDLL.DLL 中引发断点的东西。继续超过这一点会导致
项目引发异常类 $C0000005 并带有消息“0x7747206e 的访问冲突:读取地址 0x539b8dba”。
如果您仔细观察,这不是标准的访问冲突消息。
当它命中时堆栈跟踪的顶部Int 3
如下所示:
:774e475d ; ntdll.dll
:774afad0 ; ntdll.dll
:774e5de9 ; ntdll.dll
:774a6dff ; ntdll.dll
:76fc1075 ; C:\Windows\system32\ole32.dll
:770e443a ; C:\Windows\system32\oleaut32.dll
:770e3ea3 oleaut32.SysFreeString + 0x4a
有谁知道这里发生了什么?
编辑(来自评论):
不过,这不是 WideString。它是由 StringToOleStr 生成的 PWideChar,传入非空字符串时不会出现 double-free 错误。不幸的是,我无法真正发布代码示例,因为这是受版权保护的第三方组件。(而且我不能向他们寻求支持,因为它不再受支持。基本上,整个事情都是一团糟。)