Ada_Ru форум

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

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

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

Сообщения

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

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

 

мне кажется, что это не вполне так. это было бы почти так, если бы a := b происходило следующим образом:

 

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

tmp = allocate ( sizeof(b) );

memcpy( tmp, b );

Ajust(tmp)

a = allocate ( sizeof(b) );

memcpy( a, tmp );

---

однако в Ada, все происходит так:

 

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

a = allocate ( sizeof(b) );

memcpy( a, b );

Ajust(a)

---

таким образом, если в Ajust произойдет исключение, то содержимое 'a' уже будет испорчено предыдущим

копированием. иными словами, в отличие от С++, здесь невозможно писать код, удовлетворяющий т.н.

strong exception guarantee http://www.gotw.ca/gotw/059.htm

 

<quote>

The strong guarantee involves transactional commit/rollback semantics: failed operations guarantee program state is unchanged with respect to the objects operated upon. This means no side effects that affect the objects, including the validity or contents of related helper objects such as iterators pointing into containers being manipulated.

</quote>

sve wrote:

таким образом, если в Ajust произойдет исключение, то содержимое 'a' уже

будет испорчено предыдущим

копированием.

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

 

иными словами, в отличие от С++, здесь невозможно писать код,

удовлетворяющий т.н.

strong exception guarantee http://www.gotw.ca/gotw/059.htm

 

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

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

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