Ada_Ru форум

Обсуждение языка Ада

Re: [ada_ru] Высвобождениепамяти.

Оставить новое сообщение

Сообщения

sve
Re: [ada_ru] Высвобождениепамяти.
2007-07-13 10:58:51

 

>Если верить RM05 7.6 (17):

>"For an assignment_statement, after the name and expression have been >evaluated, and any conversion (including constraint checking) has been >done, an anonymous object is created, and the value is assigned into it; >that is, the assignment operation is applied. (Assignment includes value >adjustment.) The target of the assignment_statement is then finalized. >The value of the anonymous object is then assigned into the target of >the assignment_statement. Finally, the anonymous object is finalized. As >explained below, the implementation may eliminate the intermediate >anonymous object, so this description subsumes the one given in 5.2, >“Assignment Statements”."

 

>то оно полностью описывает поведение Вашего псевдокода для C++ ;-)

 

это был псевдокод не для с++, а "желательный" для Ada, однако я совершенно упустил из виду (Вы мне напомнили), что исключения, возникшие в Ajust *не могут* покинуть Ajust. т.е. даже если компилятор и не станет выкидывать временный объект ( gnat к стати выкидывает ), то это уже не имеет значения. иными словами в Ada оператор ':=' или выполнится (в том смысле, что lvalue будет изменено, пусть даже и неверно ) или программа завершится аварийно (в том случае если в Ajust возникнет исключение и выйдет за его границы).

(представьте например - вы аллокируете в Ajust память и получаете Storage_Error - единственный выход - завершить программу аварийно ... или отловить и придушить это исключение внутри Ajust и в итоге получить невалидный объект.)

 

возможно кто то скажет что в этом есть своя прелесть - не буду спорить, однако "транзакционного поведения" адский ':=' обеспечить не может. в этом одно из отличий от с++-шного 'operator ='.

 

 

>А зачем может требоваться такая столь хитрая конструкция?

 

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

sve wrote:

 

это был псевдокод не для с++, а "желательный" для Ada, однако я совершенно

упустил из виду (Вы мне напомнили), что исключения, возникшие в Ajust *не

могут* покинуть Ajust. т.е. даже если компилятор и не станет выкидывать

временный объект ( gnat к стати выкидывает ), то это уже не имеет значения.

иными словами в Ada оператор ':=' или выполнится (в том смысле, что lvalue

будет изменено, пусть даже и неверно ) или программа завершится аварийно (в

том случае если в Ajust возникнет исключение и выйдет за его границы).

 

Исключение внутри Adjust транслируется в стандартное Program_Error (если мне не изменяет память). Промежуточный объект конечно же освободится, но вот исключение можно пробовать "поймать" и пробовать что-то исправлять (сомневаюсь, что это реально может помочь).

On Fri, 13 Jul 2007 14:58:51 +0400, you wrote:

 

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

 

Что, и не потребуется в Adjust, поскольку память уже выделена, данные скопированы, и размер больше чем нужно.

 

Вообще, при уровне косвенности 0, проблем с выделением памяти быть не может, в том смысле, что это - забота компилятора. Если уровень больше, то разумно использовать reference counting, что в частности исключает deep copy, но главное, любые обращения к new из Adjust-а.

 

Так что, проблемы, если и есть (а они конечно есть), то не там, где Вы их ищете.

 

--

Regards,

Dmitry A. Kazakov

http://www.dmitry-kazakov.de

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти