Привет всем.
По мере моей работы с Delphi я нахожу интересные подводные камни, приводящие к ошибкам. Парочкой из них я хочу поделиться с вами в форме задачек. Ответы на них я опубликую через пару дней, а пока вы можете попробовать разобраться в не очевидном поведении самостоятельно. Если интересно — добро пожаловать под кат.
Задачка 1
type IData = interface function Ptr: Pointer; end; procedure AddData(Data1, Data2: IData; out OutData: IData); begin OutData := CreateMerged_IData(Data1.Ptr, Data2.Ptr); //функция Create_IData создает новый экземпляр IData end; var DataArr: array of IData; procedure AddDataToAll(const AExtraData: IData); var i: Integer; begin if not Assigned(AExtraData) then Exit; for i := 0 to Length(DataArr) - 1 do AddData(DataArr[0], AExtraData, DataArr[0]); end;
Итак, у нас есть интерфейс IData, который хранит какие-то данные. Функция AddData должна создавать новый экземпляр IData на базе двух других.
Так же у нас есть массив DataArr, в котором нет нулевых элементов, и в какой-то момент мы вызываем AddDataToAll. Но процедура работает не так как мы ожидаем. Почему?
Задачка 2
var FCollection: TDictionary<TObject, Integer>; procedure KillObject(var Obj: TObject); begin if FCollection.ContainsKey(Obj) then begin //DoSomething obj.Free; FCollection.Remove(obj); obj := nil; end; end;
Здесь FCollection был создан вот так: FCollection := TDictionary<TObject, Integer>.Create;
Obj — всегда валидный существующий объект. Но между тем данный код иногда падает. Почему?
Ответ на задачку 1
Будет опубликован 25 октября
Ответ на задачку 2
Будет опубликован 25 октября
ссылка на оригинал статьи http://habrahabr.ru/post/269359/
Добавить комментарий