Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.14;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.03 c
14-1116943814
Igorek
2005-05-24 18:10
2005.06.14
Сообщение об ошибке с указанием файла и номера строки


4-1113570506
ANB
2005-04-15 17:08
2005.06.14
Работа с меню в чужом приложении


4-1114281844
Host
2005-04-23 22:44
2005.06.14
Как проверить возможность записи в файл


14-1116796669
Zacho
2005-05-23 01:17
2005.06.14
AMD: Три буквы для бедных


3-1115460568
Mr.F
2005-05-07 14:09
2005.06.14
Построение дерева из базы данных