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(通过大型数据集分页)所以它发生在加载数据量很大的时候。
我正在尝试解决此代码中出现的 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(通过大型数据集分页)所以它发生在加载数据量很大的时候。