Подтвердить что ты не робот

Может ли вектор <T>:: clear throw?

Есть ли вероятность вызова std::vector<T>::clear() для исключения?

4b9b3361

Ответ 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 > Нет:

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

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