Страница 1 из 2
Как запретить исключение std::bad_alloc?
Добавлено: 26 авг 2015, 05:48
Сионист
Как запретить исключение std::bad_alloc?
Re: Как запретить исключение std::bad_alloc?
Добавлено: 26 авг 2015, 10:52
Romeo
Зачем его запрещать? Его можно перехватить и обработать. Это не выход?
Re: Как запретить исключение std::bad_alloc?
Добавлено: 26 авг 2015, 11:14
Сионист
Нет конечно. Обработать надо рядом с самим оператором new, а не чёрт знает где. Поэтому обработать надо равенство указателя nullptr, а не исклюкаку. А перехват - не решение. Представьте себе, что Вы очкарик и Вам надо разглядеть мелкий предмет. А перед тем, как возникла задача, кто то разбил Ваши очки. Вы подходите к полке, чтоб их взять, видите, что они разбиты и тут бац телепортация в другую галактику, которое и есть на самом деле та самая исклюкака, где Вам некому сказать: "Нет очков, надо завтра заказать новые". И вместо того, чтоб хотябы радировать на Землю, что надо заказать очки, Вы начинаете выяснять, а где же Вы вообще оказались. Классное решение.
Re: Как запретить исключение std::bad_alloc?
Добавлено: 26 авг 2015, 11:39
Romeo
Пантомиму об очках не понял.
Чем вот это не вариант? Обработка рядом c new, как ты и хотел.
Код: Выделить всё
int* AllocateBigBuffer()
{
int* p = nullptr;
try
{
p = new int [100000];
}
catch (const std::bad_alloc&)
{
std::cout << "Error of allocation" << std::endl;
}
return p;
}
Re: Как запретить исключение std::bad_alloc?
Добавлено: 26 авг 2015, 11:49
Сионист
Если ошибка не произошла, то куда здесь пихать работу с указателем?
Re: Как запретить исключение std::bad_alloc?
Добавлено: 26 авг 2015, 12:01
Romeo
Код: Выделить всё
std::unique_ptr ptr = AllocateBigBuffer();
if (ptr != nullptr)
{
// Work with big buffer
}
Re: Как запретить исключение std::bad_alloc?
Добавлено: 26 авг 2015, 18:03
Сионист
1. Что за AllocateBigBuffer? Как ему казать количество объектов?
2. На какой тип может указывать std::unique_ptr?
3.
Объект этого класса теряет права владения ресурсом при копировании (присваивании, использовании в конструкторе копий, передаче в функцию по значению).
А нафига мне ещё тормозить прогу подсистемой какого то не понятного "владения"?
4.
В отличии от auto_ptr, unique_ptr запрещает копирование.
А нафига мне тогда указатель?
Re: Как запретить исключение std::bad_alloc?
Добавлено: 26 авг 2015, 18:16
Сионист
Надо
только запретить std::bad_alloc, чтоб new вёл себя как до появления std::bad_alloc, то есть при невозможности выделить память возвращал NULL. Ну пусть nullptr, в этом контексте не велика разница.
Код: Выделить всё
try
{
p1 = new *int [100];
for (p2=p1+99; p2>=p1; --p2)
{
*p2=new int[100];
}
}
catch (const std::bad_alloc&)
{
std::cout << "Error of allocation" << std::endl;
}
, свалилась исклюкака. От какого new? А если new вернёт nullptr, то я и подчищу, что уже выделено и выведу сообщение и рекомендацию. На таких настойках не смог выделить? Эйси. Их можно уменьшить, а лишние программы закрыть, можно будет повторить команду, при этом память к ней не утечёт и первая попытка не будет мешать повторной, но при этом и результаты предыдущей работы программы не будут потеряны и их даже не надо будет грузить с диска.
Re: Как запретить исключение std::bad_alloc?
Добавлено: 26 авг 2015, 18:37
Сионист
И вообще, очевидно же, что если бы мне нужны глупые указатели, то я бы писал на решётке, или на джаве. А если бы мне хотелось исключений, то в делфях, или на лазарусе. Но я пишу на плюсах.
Re: Как запретить исключение std::bad_alloc?
Добавлено: 26 авг 2015, 19:14
Сионист