![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Несколько вопросов по правильности кода
Antonn © (2005-05-26 14:13:00)Здравствуйте! Возникто пара вопросов. Есть код(ниже), если случится ошибка в блоке 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;
TUser (2005-05-26 20:05:00) [1]Я имел в виду, что в [11] я написал except, на надо было finally
Antonn (2005-05-26 17:31:00) [2]TUser © (26.05.05 16:33) [13]
except = finally
я считал по другому, except возникает при ошибках, finally в конце и при ошибках.
TUser (2005-05-26 16:33:00) [3]> False между except и end.
except = finally
Eraser (2005-05-26 16:29:00) [4]TUser © (26.05.05 16:24) [11]
Точно, я что-то и не заметил.
Antonn ©
Ну тогда ->> TUser © (26.05.05 14:24) [4].
Antonn (2005-05-26 16:24:00) [5]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:00) [6]Он же в [3] описал задачу. Булевый флаг тут - не оптимальное решение, но если по-другому никак - то надо присваивать ему False между except и end.
Eraser (2005-05-26 16:13:00) [7]Antonn © (26.05.05 16:06) [8]
А какое "логическое" значение у неё, т.е. при каких условиях она true или false?
Antonn (2005-05-26 16:06:00) [8]Digitman © (26.05.05 14:41) [7]
глобальная переменная. объявлен после implementation, ничего умнее я пока не думал:)
Digitman (2005-05-26 14:41:00) [9]
> Antonn © (26.05.05 14:21) [3]
> GET_STOP - тип boolean
тебя не о "типе" спрашивают) ... эт понятно что boolean ...
тебя спрашивают, как и где объявлен идентификатор GET_STOP ..
если это булево св-во некоего объекта, при обращении к которому вызываются соотв.методы того объекта, никто не даст гарантий насчет корректности баланса памяти. ибо неизвестно что творится в этих методах
TUser (2005-05-26 14:40:00) [10]> А вероятность возникновения исключения в данном конструкторе почти нулевая.
Собственно говоря, тогда все закончилось, если не ошибаюсь, тем что все хмыкнули, приняли к сведению, но продолжили писать как раньше - так же как пишут Борландовские программисты, например.
TUser (2005-05-26 14:24:00) [11]> GET_STOP - тип boolean, должен "на выходе"(при работе тела
> процедуры) становиться false. Т.е. ввел его, что бы при
> быстром повторном вызове небыло путаницы и не вылетало
> "Файл занят другим приложением". Только проверки еще нет.
Лучше применить стандартные штуки, например, критические секции - тогда твоя процедура не будет выполняться два раза одновременно в разных потоках.
Eraser (2005-05-26 14:24:00) [12]TUser © (26.05.05 14:19) [2]
Правильно то оно правильно, вот только если этих TMemoryStream 5 или 10 создаётся - код будет, мягко говоря, нечитабельным. А вероятность возникновения исключения в данном конструкторе почти нулевая.
Antonn (2005-05-26 14:21:00) [13]GET_STOP - тип boolean, должен "на выходе"(при работе тела процедуры) становиться false. Т.е. ввел его, что бы при быстром повторном вызове небыло путаницы и не вылетало "Файл занят другим приложением". Только проверки еще нет.
TUser (2005-05-26 14:19:00) [14]В finally флаг присваивать обычно не надо. Если требуется чтобы
(а) память освобождалась в любом случае
(б) в случае ошибки устанавливался флаг, то делай примерно так
GetStop:=true;
try
..:=TMemoryStream.Create;
try
..
finally
...Free;
end;
except
get_stop:=false;
end;
Этим ты также гарантируешь перехват возможного исключения, если оно произойдет в конструкторе - была когда-то популярная тема обсуждения про то, что это типа очень рулит и очень правильно.
Eraser (2005-05-26 14:15:00) [15]Antonn © (26.05.05 14:13)
освободится ли память
да.
GET_STOP
Что такое GET_STOP, что он должен делать при ошибке?