Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Вниз

Несколько вопросов по правильности кода   Найти похожие ветки 

 
Antonn ©   (2005-05-26 14:13) [0]

Здравствуйте! Возникто пара вопросов. Есть код(ниже), если случится ошибка в блоке try..finally, освободится ли память? И, также, куда правильней поставить GET_STOP, перед finally или в finally..end? или в оба варианта?

var GET_STOP:boolean;

procedure Create_base(Dir:string);
var MOut: TMemoryStream; PM:TCluster;
begin
MOut := TMemoryStream.Create;
GET_STOP:=true;
  Try
   clear_TCluster(pm);
    mout.WriteBuffer( pm, sizeof(pm) );
    MOut.SaveToFile(Dir);
  finally
MOut.Free;
GET_STOP:=false;
end;
end;


 
Eraser ©   (2005-05-26 14:15) [1]

Antonn ©   (26.05.05 14:13)
освободится ли память


да.

GET_STOP

Что такое GET_STOP, что он должен делать при ошибке?


 
TUser ©   (2005-05-26 14:19) [2]

В finally флаг присваивать обычно не надо. Если требуется чтобы
(а) память освобождалась в любом случае
(б) в случае ошибки устанавливался флаг, то делай примерно так

GetStop:=true;
try
..:=TMemoryStream.Create;
try
 ..
finally
 ...Free;
end;
except
 get_stop:=false;
end;

Этим ты также гарантируешь перехват возможного исключения, если оно произойдет в конструкторе - была когда-то популярная тема обсуждения про то, что это типа очень рулит и очень правильно.


 
Antonn ©   (2005-05-26 14:21) [3]

GET_STOP - тип boolean, должен "на выходе"(при работе тела процедуры) становиться false. Т.е. ввел его, что бы при быстром  повторном вызове небыло путаницы и не вылетало "Файл занят другим приложением". Только проверки еще нет.


 
TUser ©   (2005-05-26 14:24) [4]

> GET_STOP - тип boolean, должен "на выходе"(при работе тела
> процедуры) становиться false. Т.е. ввел его, что бы при
> быстром  повторном вызове небыло путаницы и не вылетало
> "Файл занят другим приложением". Только проверки еще нет.

Лучше применить стандартные штуки, например, критические секции - тогда твоя процедура не будет выполняться два раза одновременно в разных потоках.


 
Eraser ©   (2005-05-26 14:24) [5]

TUser ©   (26.05.05 14:19) [2]

Правильно то оно правильно, вот только если этих TMemoryStream 5 или 10 создаётся - код будет, мягко говоря, нечитабельным. А вероятность возникновения исключения в данном конструкторе почти нулевая.


 
TUser ©   (2005-05-26 14:40) [6]

> А вероятность возникновения исключения в данном конструкторе почти нулевая.

Собственно говоря, тогда все закончилось, если не ошибаюсь, тем что все хмыкнули, приняли к сведению, но продолжили писать как раньше - так же как пишут Борландовские программисты, например.


 
Digitman ©   (2005-05-26 14:41) [7]


> Antonn ©   (26.05.05 14:21) [3]
> GET_STOP - тип boolean


тебя не о "типе" спрашивают) ... эт понятно что boolean ...

тебя спрашивают, как и где объявлен идентификатор GET_STOP ..

если это булево св-во некоего объекта, при обращении к которому вызываются соотв.методы того объекта, никто не даст гарантий насчет корректности баланса памяти. ибо неизвестно что творится в этих методах


 
Antonn ©   (2005-05-26 16:06) [8]

Digitman ©   (26.05.05 14:41) [7]
глобальная переменная. объявлен после implementation, ничего умнее я пока не думал:)


 
Eraser ©   (2005-05-26 16:13) [9]

Antonn ©   (26.05.05 16:06) [8]

А какое "логическое" значение у неё, т.е. при каких условиях она true или false?


 
Antonn ©   (2005-05-26 16:24) [10]

Eraser ©   (26.05.05 16:13) [9]
есть несколько процедур, работают с одним файлом, что бы они одновременно не решили поработать(и устроить error), я ввел глобальную переменную. При старте процедуры переменная:=true, в конце работы false. В начале процедур планируется:
if GET_STOP then exit;
Пока переменная true, другие процедуры не сработают, пока не завершится та, которая работает сейчас. Вот и возник вопрос, как сделать так, что бы при любом завершении процедуры, GET_STOP становилась false и не блокировала вообще всю работу:)

Да и про утечки хотелось себя обнадежить:)


 
TUser ©   (2005-05-26 16:24) [11]

Он же в [3] описал задачу. Булевый флаг тут - не оптимальное решение, но если по-другому никак - то надо присваивать ему False между except и end.


 
Eraser ©   (2005-05-26 16:29) [12]

TUser ©   (26.05.05 16:24) [11]

Точно, я что-то и не заметил.

Antonn ©

Ну тогда ->> TUser ©   (26.05.05 14:24) [4].


 
TUser ©   (2005-05-26 16:33) [13]

> False между except и end.

except = finally


 
Antonn ©   (2005-05-26 17:31) [14]

TUser ©   (26.05.05 16:33) [13]
except = finally

я считал по другому, except возникает при ошибках, finally в конце и при ошибках.


 
TUser ©   (2005-05-26 20:05) [15]

Я имел в виду, что в [11] я написал except, на надо было finally



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.037 c
1-1117230205
Аск1
2005-05-28 01:43
2005.06.14
Нет ли DBX SDK for Outlook Express но на Дельфи ?


1-1117548684
lucifer
2005-05-31 18:11
2005.06.14
Ошибка: Symbol faReadOnly is specific to a platform


1-1117286218
Flame
2005-05-28 17:16
2005.06.14
скопировать часть изображения


1-1116957567
Flame
2005-05-24 21:59
2005.06.14
работа с DBGrid


3-1114831865
magician
2005-04-30 07:31
2005.06.14
Сформировать запрос





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский