Форум: "Основная";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];
ВнизНаболевший вопрос. Корректно ли такое освобождение памяти Найти похожие ветки
← →
Валера_ (2002-03-04 11:19) [0]прицепляю...
for i:=1 to RowCount-1 do
for j:=1 to colCount-1 do
begin
SG.Objects[j,i]:=TSomeClass.Create;
TSomeClass(SG.Objects[j,i]).{SomeFields}:={SomeValues};
TSomeClass(SG.Objects[j,i]).{SomeFields}:={SomeValues};
TSomeClass(SG.Objects[j,i]).{SomeFields}:={SomeValues};
end;
отцепляю...
for i:=1 to RowCount-1 do
for j:=1 to colCount-1 do
begin
if SG.Objects[j,i]<>nil then
TSomeClass(SG.Objects[j,i]).Free;
SG.Objects[j,i]:=nil;
end;
← →
Alx2 (2002-03-04 11:24) [1]Кажется, да. По крайней мере, если они идут друг за другом (как в примере) :)
Но эту вещь, IMHO, аккуратнее сделать так: (вычислений меньше)
for i:=1 to RowCount-1 do
for j:=1 to colCount-1 do
begin
SG.Objects[j,i]:=TSomeClass.Create;
With TSomeClass(SG.Objects[j,i]) do
begin
{SomeFields}:={SomeValues};
{SomeFields}:={SomeValues};
{SomeFields}:={SomeValues};
end;
end;
← →
Набережных С. (2002-03-04 16:21) [2]
> Валера_ (04.03.02 11:19)
Вполне.
> Alx2 © (04.03.02 11:24)
> (вычислений меньше)
Никакой разницы.
← →
Alx2 (2002-03-11 07:53) [3]>Набережных С. (04.03.02 16:21)
>Никакой разницы
Неправда! разница есть. И она состоит в количестве вызовов TStringGrid.GetObjects (и не только, но этого достаточно)
← →
Lord Warlock (2002-03-11 09:31) [4]Если D5, то можно использоавать FreeAndNil(Class)
← →
kull (2002-03-11 11:23) [5]Вычислений может и меньше (хотя это точно неизвестно даже тем, кто писал компилятор DCC32.exe), а вот ,простите, геморою больше.
И вообше использовать "with" как то не красиво, неаккуратно, и даже не рекомедуется (причем самими разработчиками Delphi), это из той же серии, что и "goto"...
← →
DieHard (2002-03-11 11:47) [6]Из хелпа:
A with statement is a shorthand for referencing the fields of a record or the fields, properties, and methods of an object. The syntax of a with statement is
with obj do statement
or
with obj1, ..., objn do statement
where obj is a variable reference denoting an object or record, and statement is any simple or structured statement.
If the interpretation of obj involves indexing arrays or dereferencing pointers, these actions are performed once, before statement is executed. This makes with statements efficient as well as concise. It also means that assignments to a variable within statement
cannot affect the interpretation of obj during the current execution of the with statement.
← →
Alx2 (2002-03-11 12:00) [7]>kull (11.03.02 11:23)
Ссылочку на это гонево можно?
← →
Shaman_Naydak (2002-03-11 12:13) [8]>kull
Присоединяюсь к Alx2
← →
kull (2002-03-11 12:13) [9]
> with obj1, ..., objn do statement
Ну и как вам эта кострукция?
А потом разбирайся с каким объектом работаешь внутри "with", если поля названы одинаково?
(хотя понятно (из того же хелпа) что обращение идет с права на лево).
Код надо писать понятным для человека и легко читаемым.
Например такой изврат:
type
TSubkaka = record
F: string;
end;
TKaka = record
F: TSubkaka;
end;
..................
var
kaka1,kaka2,kaka3: TKaka;
subkaka: TSubkaka;
.............
with subkaka,kaka1,kaka2,kaka3 do
begin
F.F := "kaka";
F := subkaka;
// F := "kaka";
end;
....................
а теперь раскомментируем последнюю строку в теле with и
попереставляем subkaka после with...
Вредно заниматься преждевременной оптимизацией.
И к тому же выигрывать надо за счет алгоритма...
← →
Alx2 (2002-03-11 12:29) [10]>А потом разбирайся с каким объектом работаешь внутри
>"with", если поля названы одинаково?
Это - искусственный геморрой. Используй разные with.
Вообще, with себя оправдывает (в плане производительности и незамусоренности кода), когда необходимо обработать множество полей. Бывает, когда в некоторой формуле нужно использовать множество полей объекта и писанина типа Point((Bitmap.Canvas.ClipRect.Right+Bitmap.Canvas.ClipRect.Left) div 2,(Bitmap.Canvas.ClipRect.Top+Bitmap.Canvas.ClipRect.Bottom) div 2), только запутывает излишней подробностью.
PS
Это азбука без темы для разговора.
← →
kull (2002-03-11 12:35) [11]
> Alx2
С последним согласен.
А вот ссылочка на крохотный стандартик.
Следованть не обязательно, но стоит задуматься...
http://download.olis.ru/pages.php?direction=softlab
← →
Alx2 (2002-03-11 12:47) [12]>kull (11.03.02 12:35)
>Следованть не обязательно, но стоит задуматься...
> http://download.olis.ru/pages.php?direction=softlab
Прочел. Но, думаю, здесь скорее всего вопрос стиля программирования. И именно при использования with obj1, obj2, .. do. С этим случаем почти согласен. Есть подводные камни. Но опять-таки, нужно знать, что делаешь....
← →
Anatoly Podgoretsky (2002-03-11 21:40) [13]Валера_ (04.03.02 11:19)
Проверку на nil перед Free делать не стоит, двойная работа, она делается внутри Free
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c