Ada_Ru форум

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

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

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

Сообщения

sve
Re: [ada_ru] Высвобождениепамяти.
2007-07-12 12:19:29

>прост - жизнь a при возбуждении исключения внутри Adjust атоматически >завершится. Никто и ничто никогда не узнают где был и что из себя >представлял этот самый a.

 

я могу ошибаться, однако насколько я помню запрещено только 'выпускать' исключения из Ajust.

однако это не имеет значения. было сказано, что

<quote>

Ну да, а Adjust от переопределения "=" отличается лишь по форме, а не по сути.

</quote>

 

с чем я собственно и не согласился. что касается

 

>В любом случае

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

 

то я с вами совершенно согласен, за исключением того, что в С++ можно реализовать (перегрузить)

'operator = ' таким образом, что он будет эту 'транзакционность'

потдерживать, а в Ada, с помощью Ajust, этого невозможно добиться. это нужно реализовывать в ОТДЕЛЬНОЙ процедуре.

 

есть еще примеры, где адская реализация присваивания НЕ работает и вам придется писать отдельную процедуру, реализующую это присваивание. представьте например некий класс A, содержащий указатель p, который ссылается на некие данные в хипе.

 

Условие: при присваивании a := b (a и b экземпляры A) необходимо:

--- псевдокод

 

if ( data_size(a.p) < data_size(b.p) ) { // аллокируем только тогда, когда это необходимо

deallocate a.p

a.p = allocate ( data_size(b.p) )

}

copy b.p -> a.p

 

в С++ в 'operator = ' нет никаких проблем для реализации этого поведения. в Ada, с ':=' вы в лучшем случае получите

 

--- псевдокод

 

deallocate a.p

a.p = allocate ( data_size(b.p) )

copy b.p -> a.p

sve wrote:

<quote>

Ну да, а Adjust от переопределения "=" отличается лишь по форме, а не по

сути.

</quote>

 

с чем я собственно и не согласился. что касается

 

Если верить 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++ ;-)

 

есть еще примеры, где адская реализация присваивания НЕ работает и вам

придется писать отдельную процедуру, реализующую это присваивание.

представьте например некий класс A, содержащий указатель p, который

ссылается на некие данные в хипе.

 

Условие: при присваивании a := b (a и b экземпляры A) необходимо:

 

--- псевдокод

 

if ( data_size(a.p) < data_size(b.p) ) { // аллокируем только тогда, когда

это необходимо

deallocate a.p

a.p = allocate ( data_size(b.p) )

}

copy b.p -> a.p

 

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

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

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