Есть ли вероятность вызова std::vector<T>::clear()
для исключения?
Может ли вектор <T>:: clear throw?
Ответ 1
Нет.
[2003: 21.2.1/11 | n3290: 21.2.1/10]:
Если не указано иное (см. 23.2.4.1, 23.2.5.1, 23.3.3.4 и 23.3.6.5) все типы контейнеров определенные в этом разделе, удовлетворяют следующим дополнительным требованиям: [..] - нетerase()
,clear()
,pop_back()
илиpop_front()
функция генерирует исключение. [..]
Что произойдет, если меня удалит деструктор типа элемента?
В С++ 11 std::vector<T>::clear()
помечено noexcept
([n3290: 23.3.6/1]
).
Любые исключения, выпавшие из ~T
, могут быть пойманы реализацией, так что clear()
сам не может ничего выбросить. Если это не так, и это исключение является "неожиданным" и завершает процесс, а не распространяется:
struct T {
~T() { throw "lol"; }
};
int main() {
try {
vector<T> v{T()};
v.clear();
}
catch (...) {
cout << "caught";
}
}
// Output: "terminated by exception: lol" (GCC 4.7.0 20111108)
[n3290: 15.5.1]:
В некоторых ситуациях обработка исключений должна быть заброшенные за менее тонкие методы обработки ошибок. [..] - когда поиск обработчика (15.3) встречает внешний блок функции без спецификации исключения, которая не позволяет исключение (15.4) [..]
Ответ 2
Нет.
Изменить: К сожалению, случайно используется N3126. Ниже приведены некоторые номера стандартных разделов.
23.2.1p11:
Если не указано иное (см. 23.2.4.1, 23.2.5.1, 23.3.2.3 и 23.4.1.4), все типы контейнеров, определенные в этом разделе, удовлетворяют следующим дополнительным требованиям:...
- Функция
- no
erase()
,clear()
,pop_back()
илиpop_front()
генерирует исключение.
В 23.4.1.4, vector
имеет исключения для erase
(так как может потребоваться скопировать или переместить некоторые элементы), но ни один из остальных.
Если деструктор элемента выбрасывается во время clear()
, это приведет к std::unexpected()
.
Ответ 3
Да, если деструктор T
выбрасывает, в противном случае нет.
Обновление: Кажется, я был мертв неправильно; он просто падает в этом случае
Ответ 4
Да и Нет
Да:
clear
в конечном итоге вызывает оператор delete[]
, который включает вызов деструкторов всех объектов и массив (если они есть) и free
память.
Деструкторы могут в конечном итоге вызвать исключение.
Освобождение памяти может также не работать в ненормальных случаях (например, при повреждении кучи и т.д.)
<Не p > Нет:Выбрасывание исключений - деструкторы подвергаются критике и в большинстве случаев не происходят (по крайней мере, в стандартных библиотеках). Помимо того факта, что исключение, выведенное из деструктора во время разматывания стека (вызванное другим исключением), может не обрабатываться, существует логическая проблема с исключениями в деструкторах.
Ошибка в освобождении памяти, обычно вызванная повреждением кучи или другой неустранимой проблемой. В любом случае, судьба программы - умереть, независимо от того, будет ли исключение или нет.