Форум: "Основная";
Текущий архив: 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