Как запретить исключение std::bad_alloc?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Как запретить исключение std::bad_alloc?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Зачем его запрещать? Его можно перехватить и обработать. Это не выход?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Нет конечно. Обработать надо рядом с самим оператором new, а не чёрт знает где. Поэтому обработать надо равенство указателя nullptr, а не исклюкаку. А перехват - не решение. Представьте себе, что Вы очкарик и Вам надо разглядеть мелкий предмет. А перед тем, как возникла задача, кто то разбил Ваши очки. Вы подходите к полке, чтоб их взять, видите, что они разбиты и тут бац телепортация в другую галактику, которое и есть на самом деле та самая исклюкака, где Вам некому сказать: "Нет очков, надо завтра заказать новые". И вместо того, чтоб хотябы радировать на Землю, что надо заказать очки, Вы начинаете выяснять, а где же Вы вообще оказались. Классное решение.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Пантомиму об очках не понял.

Чем вот это не вариант? Обработка рядом 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;
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Если ошибка не произошла, то куда здесь пихать работу с указателем?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Код: Выделить всё

std::unique_ptr ptr = AllocateBigBuffer();
if (ptr != nullptr)
{
   // Work with big buffer
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

1. Что за AllocateBigBuffer? Как ему казать количество объектов?
2. На какой тип может указывать std::unique_ptr?
3.
Объект этого класса теряет права владения ресурсом при копировании (присваивании, использовании в конструкторе копий, передаче в функцию по значению).
А нафига мне ещё тормозить прогу подсистемой какого то не понятного "владения"?
4.
В отличии от auto_ptr, unique_ptr запрещает копирование.
А нафига мне тогда указатель?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Надо только запретить 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, то я и подчищу, что уже выделено и выведу сообщение и рекомендацию. На таких настойках не смог выделить? Эйси. Их можно уменьшить, а лишние программы закрыть, можно будет повторить команду, при этом память к ней не утечёт и первая попытка не будет мешать повторной, но при этом и результаты предыдущей работы программы не будут потеряны и их даже не надо будет грузить с диска.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

И вообще, очевидно же, что если бы мне нужны глупые указатели, то я бы писал на решётке, или на джаве. А если бы мне хотелось исключений, то в делфях, или на лазарусе. Но я пишу на плюсах.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Всё, сам нашёл.

Код: Выделить всё

p=new (std::nothrow) type;
, или

Код: Выделить всё

p=new (std::nothrow) type[count];
.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить