Как запретить исключение std::bad_alloc?
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Как запретить исключение std::bad_alloc?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Зачем его запрещать? Его можно перехватить и обработать. Это не выход?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Нет конечно. Обработать надо рядом с самим оператором new, а не чёрт знает где. Поэтому обработать надо равенство указателя nullptr, а не исклюкаку. А перехват - не решение. Представьте себе, что Вы очкарик и Вам надо разглядеть мелкий предмет. А перед тем, как возникла задача, кто то разбил Ваши очки. Вы подходите к полке, чтоб их взять, видите, что они разбиты и тут бац телепортация в другую галактику, которое и есть на самом деле та самая исклюкака, где Вам некому сказать: "Нет очков, надо завтра заказать новые". И вместо того, чтоб хотябы радировать на Землю, что надо заказать очки, Вы начинаете выяснять, а где же Вы вообще оказались. Классное решение.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Пантомиму об очках не понял.
Чем вот это не вариант? Обработка рядом c new, как ты и хотел.
Чем вот это не вариант? Обработка рядом 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Если ошибка не произошла, то куда здесь пихать работу с указателем?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
1. Что за AllocateBigBuffer? Как ему казать количество объектов?
2. На какой тип может указывать std::unique_ptr?
3.
4.
2. На какой тип может указывать std::unique_ptr?
3.
А нафига мне ещё тормозить прогу подсистемой какого то не понятного "владения"?Объект этого класса теряет права владения ресурсом при копировании (присваивании, использовании в конструкторе копий, передаче в функцию по значению).
4.
А нафига мне тогда указатель?В отличии от auto_ptr, unique_ptr запрещает копирование.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Надо только запретить std::bad_alloc, чтоб new вёл себя как до появления std::bad_alloc, то есть при невозможности выделить память возвращал NULL. Ну пусть nullptr, в этом контексте не велика разница. , свалилась исклюкака. От какого new? А если new вернёт 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;
}
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
И вообще, очевидно же, что если бы мне нужны глупые указатели, то я бы писал на решётке, или на джаве. А если бы мне хотелось исключений, то в делфях, или на лазарусе. Но я пишу на плюсах.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Всё, сам нашёл. , или .
Код: Выделить всё
p=new (std::nothrow) type;
Код: Выделить всё
p=new (std::nothrow) type[count];
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.