Является ли "Недостаточно памяти" исправимой ошибкой? - PullRequest
75 голосов
/ 02 декабря 2008

Я давно программирую, и программы, которые я вижу, когда им не хватает памяти, пытаются очистить и завершить работу, т.е. Я не могу вспомнить, когда в последний раз видел, как кто-то действительно пытался восстановиться и продолжить работу в обычном режиме.

Так много обработки зависит от возможности успешно распределять память, особенно в языках с сборкой мусора, и кажется, что ошибки из-за нехватки памяти должны классифицироваться как невосстановимые. (К неисправимым ошибкам относятся такие вещи, как переполнение стека.)

Какой веский аргумент в пользу того, чтобы сделать его исправимой ошибкой?

Ответы [ 23 ]

0 голосов
/ 04 января 2009

Недостаточно памяти, как правило, означает, что вы должны выйти из того, что вы делали. Если вы будете осторожны с очисткой, она может оставить саму программу в рабочем состоянии и сможет отвечать на другие запросы. Лучше иметь программу, которая скажет: «Извините, недостаточно памяти для выполнения», чем сказать: «Извините, не хватает памяти, завершение работы».

0 голосов
/ 02 декабря 2008

Это сложный вопрос. На первый взгляд кажется, что отсутствие больше памяти означает «неудача», но вы также должны увидеть, что можно избавиться от многих вещей, связанных с памятью, если вы действительно настаиваете. Давайте просто возьмем неработающую функцию strtok, у которой, с одной стороны, нет проблем с памятью. Затем возьмите в качестве аналога g_string_split из библиотеки Glib, которая сильно зависит от распределения памяти как почти все в программах, основанных на glib или GObject. Можно определенно сказать, что в более динамичных языках выделение памяти используется гораздо чаще, чем в более негибких языках, особенно C. Но давайте посмотрим на альтернативы. Если вы просто завершаете программу, если у вас заканчивается память, даже тщательно разработанный код может перестать работать. Но если у вас есть исправимая ошибка, вы можете что-то с этим сделать. Таким образом, аргумент, делающий его восстанавливаемым, означает, что можно «по-разному» справляться с этой ситуацией (например, откладывать блок памяти на случай чрезвычайных ситуаций или ухудшение в менее обширной программе).

Итак, самая веская причина. Если вы предоставляете способ восстановления, вы можете попробовать восстановление, если у вас нет выбора, все зависит от того, всегда ли вам достаточно памяти ...

Привет

0 голосов
/ 12 декабря 2008

Это просто озадачивает меня сейчас.

На работе у нас есть пакет приложений, работающих вместе, и памяти не хватает. В то время как проблема заключается в том, чтобы заставить пакет приложений работать 64-битно (и, таким образом, иметь возможность работать за пределами 2 Go, которые есть у нас на обычной ОС Win32), и / или сократить использование памяти, эта проблема «Как выздороветь от ООМ "не уйдет из моей головы.

Конечно, у меня нет решения, но я все еще играю в поиске C ++ (в основном из-за RAII и исключений).

Возможно, процесс, который должен корректно восстанавливаться, должен прервать свою обработку в атомарных / откатных задачах (т. Е. С использованием только функций / методов, дающих надежную / не исключительную гарантию исключений) с резервным буфером / пулом памяти для целей восстановления. .

В случае сбоя одной из задач C ++ bad_alloc размотает стек, освободит часть памяти стека / кучи через RAII. После этого функция восстановления будет в максимально возможной степени спасать (сохранять исходные данные задачи на диске для последующего использования) и, возможно, зарегистрировать данные задачи для последующей попытки.

Я верю, что использование сильных / nothrow гарантий C ++ может помочь процессу выжить в условиях низкой доступной памяти, даже если это будет похоже на обмен памяти (т. Е. Медленный, несколько не отвечающий и т. Д.), Но, конечно, Это всего лишь теория. Мне просто нужно разобраться с предметом, прежде чем пытаться смоделировать это (т.е. создать программу на C ++ с настраиваемым распределителем new / delete с ограниченной памятью, а затем попытаться выполнить некоторую работу в этих стрессовых условиях).

Ну ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...