Как правильно ловить bad alloc у оператора new?
У меня есть такой фрагмент кода в блоке try, который использует считанные из файла данные для выделения памяти для матрицы:
int **new_data = new int*[rows];
for (int i = 0; i < rows; i++) new_data[i] = new int[cols];
И после блока try:
catch (std::bad_alloc) {
MatrixException ex(5);
std::cout << ex.what();
}
Метод, который должен кидать исключение:
void Matrix::load(std::fstream& is) {
if (!is.is_open()) throw 3;
int tmpr = rows;
int tmpc = cols;
if (!is) throw 4;
is >> rows;
if (!is) throw 4;
is >> cols;
int **new_data = new int*[rows];
for (int i = 0; i < rows; i++) new_data[i] = new int[cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (!is) {
for (int i = 0; i < rows; i++) delete[] new_data[i];
delete[] new_data;
rows = tmpr;
cols = tmpc;
throw 4;
}
is >> new_data[i][j];
}
}
if (!(tmpr == 0 || tmpc == 0)) {
for (int i = 0; i < tmpr; i++) delete[] data[i];
delete[] data;
}
data = new_data;
return;
}
При попытке загрузки из файла со значением rows = 1000000000 программа доходит до фрагмента кода, в котором выделяется память и зависает, при запуске под valgrind выдает ошибку Warning: set address range perms: large range, хотя по задумке должно ловится исключение и выводиться соответствующее сообщение на экран
Ответы (1 шт):
Автор решения: Vladimir Afanasyev
→ Ссылка
catch (bad_alloc& ba)
{
cerr << "bad_alloc caught: " << ba.what() << endl;
}
Пример:
void foo(int rows, int cols)
{
int** new_data = new int* [rows];
for (int i = 0; i < rows; i++) new_data[i] = new int[cols];
}
int main()
{
try
{
foo(1000000000, 1000000000);
}
catch (bad_alloc& ba)
{
cerr << "bad_alloc caught: " << ba.what() << endl;
}
return 0;
}
output:
bad_alloc caught: bad allocation