Standard (N3337
) говорит (27.5.3.1.1 Class ios_base::failure
):C++ станд :: ios_base :: исключение недостаточности
Провал класса определяет базовый класс для типов всех объектов выброшенных в виде исключения, функции в iostreams библиотеки, сообщить об ошибках , обнаруженных во время операций буфера потока.
У меня есть простой тест программа, которая эмулирует ограниченную среду ресурсов при использовании в станд :: ostringstream:
#include <sys/time.h>
#include <sys/resource.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <sstream>
int main(int argc, const char* argv[])
{
rlimit limit;
limit.rlim_cur = limit.rlim_max = 268435456;
if(setrlimit(RLIMIT_AS, &limit)) {
std::cerr << "Cannot set resource limit: " << strerror(errno) << std::endl;
exit(EXIT_FAILURE);
}
std::ostringstream os;
os.exceptions(std::ostringstream::badbit);
try {
auto iterations = 1024 * 1024 * 1024;
while(iterations && --iterations) os << 'F';
} catch(const std::ios_base::failure& ex) {
std::cerr << "Caught: std::ios_base::failure" << std::endl;
} catch(const std::bad_alloc& ex) {
std::cerr << "Caught: std::bad_alloc" << std::endl;
} catch(...) {
std::cerr << "Caught: ellipsis" << std::endl;
}
return 0;
}
В моей среде (Linux, GCC 5.3.0) я получил Caught: std::bad_alloc
на stderr
. One of online compilers показывает тот же результат.
Вопрос: почему тип исключения std::bad_alloc
, а не std::ios_base::failure
?
Поскольку исключение не брошено библиотекой iostreams, но распределитель памяти? –
Неужели он не будет восстановлен и упакован в исключение std :: ios_base :: failure? Я работаю с iostream не с распределителем памяти. – user1641854
Вы можете так подумать, но нет, стандарт не требует этого. Существует также проблема, что после того, как «bad_alloc» спровоцирован, может не хватить места для создания другого исключения. –