1

我正在尝试解决此代码中发生的 Delphi XE7 应用程序中的访问冲突,该代码是 Jedi VCL JvMemoryDataset 组件的一部分(Github 的当前源代码):

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


相关(带有调试建议):从 D2006 移植到 XE5 后偶尔发生访问冲突,在 XP 兼容模式下不会发生

4

1 回答 1

0

将FireDAC 查询的FetchOptions.Unidirectional属性切换为 True 后,访问冲突消失了。(属性默认值为False)

我猜这种访问冲突是由低内存情况下的内存损坏引起的。FireDAC 查询已关闭并重新打开(通过大型数据集进行分页),因此当加载的数据量很高时会发生这种情况。

于 2020-09-05T12:27:14.090 回答