我怀疑双重释放错误会导致访问冲突(稍后在同一程序中)。
给定的类包含一个通用 TDictionary 并在使用 FMyDict.OnValueNotify 创建它后分配一个 ChangeNotification 处理程序:= ChangeNotification;
procedure TMyClass.ChangeNotification(Sender: TObject; const Item: TMyValueType; Action: TCollectionNotification);
begin
if Action = cnRemoved then begin
Item.Free;
end;
end;
如果我取消注释 Item.Free,则 AV 不再出现。
但是因为 AV 是零星出现的(在程序的数百次循环迭代中出现一次),我不能完全证明存在双重释放情况。
我的第一个想法是在释放对象之前在对象中设置一些“标记”。在第二次免费时,我可以看到该标记已设置。
或者是否有不同的“最佳实践”来检测双重自由?