TJvMemoryData.InternalSetFieldData 中的偶发访问冲突

Sporadic Access Violation in TJvMemoryData.InternalSetFieldData

我正在尝试解决此代码中出现的 Delphi XE7 应用程序中的访问冲突,该代码是 Jedi VCL JvMemoryDataset 组件的一部分(当前 source 在 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 可能 return 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

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

我猜这个访问冲突是由 low-memory 情况下的内存损坏引起的。 FireDAC 查询已关闭并且 re-opened(通过大型数据集分页)所以它发生在加载数据量很大的时候。