| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Использовапие оператора new |
| Автор: 88andrey 21.4.2007, 12:49 |
| Я знаю что оператор new возврашяет NULL если не находит память, что мне делать в этой ситуации, закрывать программу ? |
| Автор: 88andrey 21.4.2007, 13:06 |
| если не хватает память для массива |
| Автор: Anikmar 21.4.2007, 13:10 |
Все зависит от задачи. Если дальнейшая работа невозможна - значит прекращайте работу. Если возможна - перехватывайте исключение и действуйте согласно своей задаче. |
| Автор: Xenon 21.4.2007, 14:10 |
| Перехватывать std::bad_aloc и думай, что делать |
| Автор: Rockie 21.4.2007, 14:28 | ||
Anikmar, да, так и есть |
| Автор: Xenon 21.4.2007, 14:30 |
| Rockie, ты по поводу исключений? Ты уверен? По-моему так только будет, если будем вызывать new с throw() ... или нет? В противном случае там просто мусор будет (даже если предварительно ты обнулил указатель. |
| Автор: dizzy1984 21.4.2007, 14:31 |
Ну не всегда, например, на borland c++ 3.1 результат оператора new надо проверять с применением if (!pointer) {...} а в остальном все так - если невозможно выделать память под жизненно важные переменные программы, то ее надо завершать уведомив пользователя о причинах/возможных путях решения проблемы |
| Автор: Rockie 21.4.2007, 14:46 |
По поводу того, что new возвращает NULL, если память выделить не удалось. |
| Автор: Xenon 21.4.2007, 15:01 |
| Rockie, так это если только вызывать new не выбрасывающий сключений. В противном случае мусор должен быть в указателе |
| Автор: W4FhLF 21.4.2007, 15:05 |
| Пишешь под win32? |
| Автор: Rockie 21.4.2007, 16:58 | ||
Так он по умолчанию такой и есть. Впрочем это уже (возможно) бкдет зависет от среды и используемых библиотек. |
| Автор: Xenon 21.4.2007, 16:59 |
| Rockie, разве? По-моему умолчанию как раз-таки кидающий исключения. |
| Автор: vinter 21.4.2007, 17:15 |
так оно и есть, исключая старые компиляторы |
| Автор: Anikmar 21.4.2007, 17:34 |
| Да было уже обсуждение что по умолчанию new делать должен. По стандарту: Просто new - выбрасывает исключение Если писать new nothrow (по моему так, точно не помню) то тогда при ошибке вернет NULL Эта тема уже поднималась. А то что старые компиляторы не придерживаются стандарта - так может на тот момент его (стандарта) не было. Надо смотреть документацию по компилятору. А если писать по стандарту - то должно быть исключение. |
| Автор: -Kp0T- 21.4.2007, 17:37 | ||
Раньше под DOS писались обьемные программы с использованием сегментации кода. Пробуй обрабатывать порциями "на лету". Принял порцию - обработал - высвободил память для повторного использования (можно просто повторно использовать без освобождения). Результаты можешь скинуть в своп (по усмотрению). Приведу пример. По терверу писал курсовую (щас невспомню было что то с мат. ожиданием), обрабатывали очень большие данные (результат вычислений приходилось сбрасывать в файл, ибо писалось под DoS, на Borlan C++ 3.1). Каждую порцию приходилось доставать из файла несколько раз и заново результат сбрасывать. Так и сдавал результаты в файлах по 300-500 Мб. Ничего, приняли |
| Автор: Rockie 21.4.2007, 18:40 |
да, по умолчанию бросает |