如果SortCompareObjects函数始终返回相同的结果(与更改结果(例如,使用EAccessViolation相对)),得到CompareText的确切原因是什么?

function SortCompareObjects(Item1, Item2: Pointer): Integer;
begin
  Result := 1; // EAccessViolation
  // Result := CompareText(...); // No EAccessViolation
end;

MyObjectList: System.Contnrs.TObjectList;

MyObjectList := System.Contnrs.TObjectList.Create;

for i := 0 to x do
  MyObjectList.Add(AObject);

MyObjectList.Sort(@SortCompareObjects); // EAccesViolation

最佳答案

假设排序函数具有某些属性,则比较排序算法将访问数组中的元素。特别,


如果f(x,y) 0
如果f(x,y)= 0,则f(y,x)= 0
如果f(x,y)f(x,x)= 0


排序算法保证如果您的函数遵守规则,它将对数组进行排序。否则,如果您不遵守规则,则所有赌注都将取消。什么事情都可能发生。如果遇到运行时错误,请不要感到惊讶。以我的经验,最常见的是堆栈溢出,但是访问冲突也是合理的。

07-28 12:30