我正在尝试解决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 兼容模式下不会发生
将FireDAC 查询的 FetchOptions.Unidirectional 属性切换为 True 后,访问冲突消失了。(属性默认值为 False(
我想这种访问冲突是由内存不足情况下的内存损坏引起的。FireDAC 查询已关闭并重新打开(通过大型数据集进行分页(,因此在加载的数据量很高时发生。