Можно и так, но гораздо проще сделать TForEachRef не процедурой, а функцией, и ориентироваться на результат, что собственно и показано в нижних вариантах кода :)
ЗЫ: и кстати, просто как совет — включайте в состав статьи ссылку на исходный код демопримеров. Не удобно все это копировать ручками и перепроверять, гораздо проще работать с уже готовыми исходниками :)
Ну выстрелить в ногу можно гораздо проще, но для этого программисту и голова нужна :)
С последним вариантом — согласен, но тут можно использовать уже TSharedPtr, например вот так.
procedure TestWriteBySharedPtr2;
var
MyObjects: array of TSharedPtr<TObject>;
I: Integer;
begin
SetLength(MyObjects, 32);
for I := 0 to Length(MyObjects) - 1 do
MyObjects[I] := TSharedPtr.Create(TObject.Create);
for I := 0 to Length(MyObjects) - 1 do
Writeln(MyObjects[I].Value.ClassName);
end;
Так не получится, ибо объект, контролируемый TObjectDestroyer нужно передавать наружу, соответственно стек уплывет при завершении работы локальной процедуры, и будет большой такой бадабум.
Ну и по поводу накладных расходов с GetMem, там куча не используется, а работает FastMem от Пьера Ле Риче, достаточно шустрый менеджеер памяти, выделяющий сразу много страниц и по вызову GetMem, просто резервирующий нужный участок на уже выделенной ранее через VitualAlloc памяти.
Идея здравая, главное чтоб перевод не исказил суть материала :)
Все еще свежы в памяти семинары, где переводчик вещал о «ручке» (handle) которую нужно не забывать закрыть вызовом «Закрыть ручку» :)
Не, тут ошибка, разбираем:
1. T — локальная переменная, значит шанс на то что она будет равна NIL достаточно призрачный.
2. В конструкторе класса происходит исключение (к примеру это TFileStream создающийся по не существующему пути)
3. происходит выход на обработчик исключения, где не созданному и, что более важно, не обниленному объекту, вызывается Free — здравствуй Access Violation :)
Ясно, нет я лучше подожду до живого железа, темболее книжку еще не до конца освоил.
А вот статьи — если чесно, я бы был только благодарен, если бы они еще были такого плана.
Пиши еще — чесно.
Мы всем IT отделом читали и смотрели ролики — действительно, все очень просто получается, если так подавать материал.
Это не слишком уж сурово? Выход через исключение — тот еще юмор.
С последним вариантом — согласен, но тут можно использовать уже TSharedPtr, например вот так.
Ведь ссылок нет, значит можно сразу говорить IntfClear, однако идеологически это не верно, поэтому описанная выше ситуация крайне маловероятна :)
Ну и по поводу накладных расходов с GetMem, там куча не используется, а работает FastMem от Пьера Ле Риче, достаточно шустрый менеджеер памяти, выделяющий сразу много страниц и по вызову GetMem, просто резервирующий нужный участок на уже выделенной ранее через VitualAlloc памяти.
Даже на минздрав не сослаться — сам втыкнул :)
Все еще свежы в памяти семинары, где переводчик вещал о «ручке» (handle) которую нужно не забывать закрыть вызовом «Закрыть ручку» :)
1. T — локальная переменная, значит шанс на то что она будет равна NIL достаточно призрачный.
2. В конструкторе класса происходит исключение (к примеру это TFileStream создающийся по не существующему пути)
3. происходит выход на обработчик исключения, где не созданному и, что более важно, не обниленному объекту, вызывается Free — здравствуй Access Violation :)
А вот статьи — если чесно, я бы был только благодарен, если бы они еще были такого плана.
Пиши еще — чесно.
Мы всем IT отделом читали и смотрели ролики — действительно, все очень просто получается, если так подавать материал.