【发布时间】:2020-06-10 14:54:58
【问题描述】:
我正在尝试解决此代码中出现的 Delphi XE7 应用程序中的访问冲突,该代码是 Jedi VCL JvMemoryDataset 组件的一部分(Github 上的当前 source):
begin
Data^ := Ord(Buffer <> nil);
Inc(Data);
if Buffer <> nil then
Move(Buffer^, Data^, CalcFieldLen(Field.DataType, Field.Size)) <---------- AV here
else
FillChar(Data^, CalcFieldLen(Field.DataType, Field.Size), 0);
end;
代码偶尔会导致地址 04020111 发生读取访问冲突。此代码是否存在明显问题? (CalcFieldLen 可能返回 0,不确定这是否与此处相关)。
我检查了 JVCL 的当前开发版本,并且 Move 调用与我的(旧)本地版本中的相同。
可能与https://issuetracker.delphi-jedi.org/view.php?id=6276的问题有关
相关(带调试建议):Sporadic Access Violation after porting from D2006 to XE5, doesn't happen in XP compatibility mode
【问题讨论】:
-
不能说我看到任何明显的错误。它是否总是在相同的字段类型上,并且 ftSupported 集中的字段类型是否从第 410 行开始(根据上一行中的警告)?您的应用使用什么计算字段类型?
-
@MartynA 调试实际的 AV 将非常困难/耗时 - AV 仅在数千个函数调用中出现一次。我怀疑这是一些内存分配/释放错误的副作用,下周将使用不同的内存管理器进行测试。非常感谢您的观看!
标签: delphi access-violation jvcl