Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Использовапие оператора new


Автор: 88andrey 21.4.2007, 12:49
Я знаю что оператор new возврашяет NULL если не находит память, что мне делать в этой ситуации, закрывать программу ?

Автор: Anikmar 21.4.2007, 13:00
Цитата(88andrey @  21.4.2007,  12:49 Найти цитируемый пост)
Я знаю что оператор new возврашяет NULL если не находит память, что мне делать в этой ситуации, закрывать программу ?


Это из чего следует?
По умолчанию new вызывает исключение при нехватке памяти.

А вот что с этим делать - тут все в руках программиста. Смотря где, что будет и чего не будет и т.п. Если, например, нехватает памяти для загрузки картинки - зачем закрывать приложение? Достаточно написать "Файл слишком большой" и предложить выбрать другой.

Автор: 88andrey 21.4.2007, 13:06
если не хватает память для массива

Автор: Anikmar 21.4.2007, 13:10
Цитата(88andrey @  21.4.2007,  13:06 Найти цитируемый пост)
если не хватает память для массива 

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

Автор: Xenon 21.4.2007, 14:10
Перехватывать std::bad_aloc и думай, что делать smile

Автор: Rockie 21.4.2007, 14:28
Цитата(Anikmar)
Это из чего следует?

Anikmar, да, так и есть

Автор: Xenon 21.4.2007, 14:30
Rockie, ты по поводу исключений? Ты уверен? По-моему так только будет, если будем вызывать new с throw() ... или нет? В противном случае там просто мусор будет (даже если предварительно ты обнулил указатель.

Автор: dizzy1984 21.4.2007, 14:31
Цитата(Anikmar @  21.4.2007,  13:00 Найти цитируемый пост)
По умолчанию new вызывает исключение при нехватке памяти.

Ну не всегда, например, на borland c++ 3.1 результат оператора new надо проверять с применением if (!pointer) {...} а в остальном все так - если невозможно выделать память под жизненно важные переменные программы, то ее надо завершать уведомив пользователя о причинах/возможных путях решения проблемы

Автор: Rockie 21.4.2007, 14:46
Цитата(Xenon @  21.4.2007,  14:30 Найти цитируемый пост)
Rockie, ты по поводу исключений? Ты уверен?

По поводу того, что 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,  15:01 Найти цитируемый пост)
Rockie, так это если только вызывать new не выбрасывающий сключений.

Так он по умолчанию такой и есть. Впрочем это уже (возможно) бкдет зависет от среды и используемых библиотек.


Автор: Xenon 21.4.2007, 16:59
Rockie, разве? По-моему умолчанию как раз-таки кидающий исключения.

Автор: vinter 21.4.2007, 17:15
Цитата(Xenon @  21.4.2007,  16:59 Найти цитируемый пост)
RoПо-моему умолчанию как раз-таки кидающий исключения.

так оно и есть, исключая старые компиляторы

Автор: Anikmar 21.4.2007, 17:34
Да было уже обсуждение что по умолчанию new делать должен.

По стандарту:
Просто new - выбрасывает исключение
Если писать new nothrow (по моему так, точно не помню) то тогда при ошибке вернет NULL
Эта тема уже поднималась.

А то что старые компиляторы не придерживаются стандарта - так может на тот момент его (стандарта) не было. Надо смотреть документацию по компилятору.

А если писать по стандарту - то должно быть исключение.


Автор: -Kp0T- 21.4.2007, 17:37
Цитата
Я знаю что оператор new возврашяет NULL если не находит память, что мне делать в этой ситуации, закрывать программу ?


Раньше под DOS писались обьемные программы с использованием сегментации кода. Пробуй обрабатывать порциями "на лету". Принял порцию - обработал - высвободил память для повторного использования (можно просто повторно использовать без освобождения). Результаты можешь скинуть в своп (по усмотрению).
Приведу пример. По терверу писал курсовую (щас невспомню было что то с мат. ожиданием),  обрабатывали очень большие данные (результат вычислений приходилось сбрасывать в файл, ибо писалось под DoS, на Borlan C++ 3.1). Каждую порцию приходилось доставать из файла несколько раз и заново результат сбрасывать. Так и сдавал результаты в файлах по 300-500 Мб. Ничего, приняли smile

Автор: Rockie 21.4.2007, 18:40
Цитата(Xenon @  21.4.2007,  16:59 Найти цитируемый пост)
По-моему умолчанию как раз-таки кидающий исключения. 

да, по умолчанию бросает smile 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)