Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> vector + исключение в конструкторе, теория 
V
    Опции темы
Artemon
Дата 26.10.2011, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Код

class C
{
   public:
             C(const C& val){};
};

vector<C> mas;
mas.push_back( C() );
mas.insert(0, C());


Останется вектор в стабильном состоянии, если при вызове метода вектора insert, произойдет исключение в копируещем конструкторе одного из объектов типа C ?





--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
azesmcar
Дата 26.10.2011, 09:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Artemon @  26.10.2011,  08:57 Найти цитируемый пост)
Останется вектор в стабильном состоянии, если при вызове метода вектора insert, произойдет исключение в копируещем конструкторе одного из объектов типа C ?

Что ты имеешь ввиду под стабильным состоянием?

В C++ принято выделять три гарантии безопасности исключений
  • базовая гарантия
  • строгая гарантия
  • гарантия отсутствия исключений
базовая гарантия
При возникновении исключения не происходит утечки ресурсов. Состояние программы может быть любое.
строгая гарантия
При возникновении исключения не происходит утечки ресурсов и программа остается в том состоянии, в котором была до вызова функции (т.е. происходит откат каких либо произведенных функцией действий).
гарантия отсутствия исключений
Полное отсутствие исключений.

При соответствии одному из этих правил функция считается безопасной (exception safe).
Вернемся к STL. Большинство операций с контейнерами в STL дают строгую гарантию безопасности исключений, тем не менее функции, строгая безопасность которых могла сказаться на производительности, дают базовую гарантию.
Для каждой функции стандарт описывает поведение при возникновении исключения.
В данном случае:
Цитата

23.2.4.3 vector modifiers [lib.vector.modifiers]

iterator insert(iterator position, const T& x);
void insert(iterator position, size_type n, const T& x);
template <class InputIterator>
void insert(iterator position, InputIterator first, InputIterator last);


Causes reallocation if the new size is greater than the old capacity. If no reallocation happens, all the iterators and references before the insertion point remain valid. If an exception is thrown other than by the copy constructor or assignment operator of T there are no effects.


В твоем примере capacity() может измениться, но элемент вставлен не будет.

PM   Вверх
Artemon
Дата 26.10.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



azesmcar, подразумевал строгую гарантию.

Цитата(azesmcar @  26.10.2011,  09:31 Найти цитируемый пост)
В твоем примере capacity() может измениться, но элемент вставлен не будет.

И возможно элементы которые находятся после ожидаемого места вставки тоже могут быть не валидными ?
Ведь при сдвиге какого-то из этих элементов и могло быть выброшено исключение в копирующем конструкторе.



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
azesmcar
Дата 26.10.2011, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Artemon @  26.10.2011,  11:17 Найти цитируемый пост)
И возможно элементы которые находятся после ожидаемого места вставки тоже могут быть не валидными ?

Да, это вполне возможно.

PM   Вверх
Artemon
Дата 26.10.2011, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Спасибо за разъяснения.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
math64
Дата 26.10.2011, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Зависит от релизации вектора. Текущую реализацию см. в соотвествующих заголовках.
В лучшем случае - элемент вставлен не будет.
Это если: выделяется новая память под элементы массива и туда копируются старые элементы;
(исключение при копировании -> удаление выделенной памяти, вектор остаётся в прежнем состоянии)
После эта новая память заменяет старую, увеличивается capacity;
Вызывется деструктор элементов в старой памяти; удаление старой памяти;
(исключение в деструкторе -> не все будет очищено)
Добавляется новый элемент, увеличивается size;
(исключение при копировании -> size не увеличен)

PM   Вверх
spyswamp
Дата 2.11.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7



math64, в деструкторе исключений быть не должно.


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.