Что не так с этим кодом?

от автора

image Привет всем.
По мере моей работы с 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *