Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


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, что он должен делать при ошибке?


Наверх

Титульная страница Поиск, карта сайта Написать письмо