Size: a a a

2020 July 28

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
magras
std::terminate, по-моему.
А если не хочешь Остановки программы что делать
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
А как исправить?
Сделать глобальную ручку, которая заставит код падать вместо появления std::bad_alloc
источник

O

Ofee in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
А если не хочешь Остановки программы что делать
В большинстве реальных случаев до этого не дойдёт. Если только программа затребовала себе сразу всю доступную (и, может, не очень) оперативку... В этом случае сделать ничего в принципе полезного, наверное, нельзя
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
А если не хочешь Остановки программы что делать
По старинке обкладываться try
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Ofee
В большинстве реальных случаев до этого не дойдёт. Если только программа затребовала себе сразу всю доступную (и, может, не очень) оперативку... В этом случае сделать ничего в принципе полезного, наверное, нельзя
Емнип тот же Саттер говорил, что если new фейлится, это не значит, что ничего нельзя сделать
источник

m

magras in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
А если не хочешь Остановки программы что делать
В линуксе этот механизм все равно не работает - системный аллокатор все равно вернет не null, даже если на самом деле свободной памяти нет.

Полагаю использование свих аллокаторов и явный вызов new с std::nothrow будет решением, если это действительно важно.
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Это зависит от логики программы. Можно попытаться выделить ту же память, но несколькими кусками меньшего размера
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
Artöm Bakri Al-Sarmini
По старинке обкладываться try
А почему new вообще кидает исключение, а не возвращает налл
источник

ПК

Побитый Кирпич... in pro.cxx
Ofee
В большинстве реальных случаев до этого не дойдёт. Если только программа затребовала себе сразу всю доступную (и, может, не очень) оперативку... В этом случае сделать ничего в принципе полезного, наверное, нельзя
Свободной памяти 1 Гб, я попросил 100 Мб, получил bad_alloc (память фрагментированна), вместо того, чтобы отказаться делать операцию (вывести ошибку в гуй/отправить ошибку клиенту), я падаю. Как то не очень звучит
источник

O

Ofee in pro.cxx
Artöm Bakri Al-Sarmini
Это зависит от логики программы. Можно попытаться выделить ту же память, но несколькими кусками меньшего размера
Да, но я думаю, что эти ситуации большей части касаются областей, где я менее компетентен. Я, скорее, имел ввиду разработку под среднестатистический десктоп/мобильные платформы, а не эмбеддед
источник

TS

Till Schneider in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
А почему new вообще кидает исключение, а не возвращает налл
Оно может как кидать, так и налл возвращать
Зависит от того, как используешь

Есть new(nothrow)
источник

ПК

Побитый Кирпич... in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
А почему new вообще кидает исключение, а не возвращает налл
Потому что new всегда возвращает указатель на сконструированный объект, это его контракт
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
А почему new вообще кидает исключение, а не возвращает налл
Потому что такой апи. Есть operator new (size_t, std::nothrow_t) noexcept
источник

m

magras in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
А почему new вообще кидает исключение, а не возвращает налл
У него есть вариант, который возвращает null. Вызывается через дополнительный аргумент std::nothrow.

А по-умолчанию используются исключения потому что это, на мой взгляд, гораздо удобнее, чем после каждой аллокации проверять результат. Кроме того, это не решает глобальную проблему. Ну вот не смогли мы выделить память в конструторе вектора. Что дальше делать?
источник

O

Ofee in pro.cxx
Побитый Кирпич
Свободной памяти 1 Гб, я попросил 100 Мб, получил bad_alloc (память фрагментированна), вместо того, чтобы отказаться делать операцию (вывести ошибку в гуй/отправить ошибку клиенту), я падаю. Как то не очень звучит
Как часто система в таком случае будет бросать bad_alloc? Я думаю, чаще система полезет в своп или начнёт выгружать из памяти какие-то менее приоритетные ресурсы. Вот когда у меня Telegram съедает всю доступную оперативку и своп, его просто OOM-killer убивает с большим запозданием, никакого bad_alloc до этого нет
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Свободной памяти 1 Гб, я попросил 100 Мб, получил bad_alloc (память фрагментированна), вместо того, чтобы отказаться делать операцию (вывести ошибку в гуй/отправить ошибку клиенту), я падаю. Как то не очень звучит
Перейди уже на 64 бита
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Constantine Drozdov
Перейди уже на 64 бита
Оперативной памяти?
источник

O

Ofee in pro.cxx
magras
У него есть вариант, который возвращает null. Вызывается через дополнительный аргумент std::nothrow.

А по-умолчанию используются исключения потому что это, на мой взгляд, гораздо удобнее, чем после каждой аллокации проверять результат. Кроме того, это не решает глобальную проблему. Ну вот не смогли мы выделить память в конструторе вектора. Что дальше делать?
Опять же, это редкая довольно редкая и нетривиальная зачастую ситуация, которая так или иначе требует пристального внимания от программиста
источник

CD

Constantine Drozdov in pro.cxx
Artöm Bakri Al-Sarmini
Оперативной памяти?
Нет, виртуальной, конечно.
источник

O

Ofee in pro.cxx
Ofee
Не вижу проблемы сравнивать исключения с возвратом монады или коды возврата с ними же. Мне кажется, это просто разные способы выразить одно и то же, обладающие разной выразительностью и уровнем абстракции. При желании и исключения можно превратить в коды возврата (был такой пропозал), и монады сделать такими же тяжёловесными с огромной иерархией наследования, как в случае с исключениями, и коды возврата заставить работать с do-нотацией, будь у нас operator try
Раз уж речь об этом зашла, @antoshkka, можно где-то узнать судьбу этого предложения? Я не нашёл какой-то новой информации о нём
источник