Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-80589
igorr
2002-03-11 03:09
2002.03.25
Как спозиционировать InputBox или InputQuery?


1-80495
Miwa
2002-02-26 17:47
2002.03.25
Как прочесть контент папки вместе с подпапками?


6-80640
Андре
2002-01-11 10:34
2002.03.25
Траффик.


1-80510
Aser17
2002-03-13 07:39
2002.03.25
Где закачать MSDN?


7-80706
Woolen
2001-11-27 11:07
2002.03.25
Лоток CD-ROM. Очень нужно! Помогите!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский