Приветствую! Как перехватывать ошибки при выделении памяти конструктором контейнера STL? Например, при выполнении следующей программы (Borland C++ 5.02, Win32 Console), если ввести достаточно большое число (500000000), выводится сообщение Abnormal program termination.
Доброе время суток, Cursor! Вообщето вот недавно в рассылке была статья про количество памяти выделяемой динамически, опытным путем нашли что это около 800 Mb (на PIII в VC), ну я думаю что на Борланде это если отличается то не на много. Давай проведем некоторые подсчеты выделяемой тобою памяти float = 4 B, 500 000 000 * 4 ~ 2Gb, плюс еще размер самой структуры листа! А как избежать крэша проги - смотри приложение из МСДНа, при не возможности выделить память будет вызываться функция переданная в _set_new_handler как параметр. Вот и все!
Приложение: Ответ отправлен: 12.12.2002, 05:51 Отправитель: PL Отвечает vitya
Здравствуйте, Cursor! Во - первых посмотри в отладчике, что происходит. Во - вторых, если проблема в релиз версии - запихни все в try { } catch (...) { } тогда, хоть вылетать не будет, а культурно завершится. Кроме того, попробуй написать свой аллокатор. Ну вроде это все, приходит в голову. И еще, например vector<> или deque<> меньше занимают места чем list - может это будет твоей альтернативой. Если ты будешь часто удалять или вставлять элементы в середину - то они и быстрее и удобней и меньше места занимают. Ответ отправлен: 12.12.2002, 13:49 Отправитель: vitya Отвечает Jadd
Здравствуйте, Cursor! Любые ошибки можно прехватить механизмом эксепшенов, т.е. включить критический блок программы в блок try. Это - первое, что напрашивается сразу. Ответ отправлен: 12.12.2002, 02:37 Отправитель: Jadd
Вопрос № 434
Sdraste . ya peregruzhau operator new kogda ya videlayu pamyat tak Object *x=new; vsio rabotaet, function - operator vizivaetsa, esli pishu Object *x=new[2], function - operator new vizivaets, chto delat mozhet kakto inache peregruzit? prosba otpravit na e-mail
Здравствуйте, Sasha! Дык ты синтаксис ANSII С++ внимательно читай. Перегрузка оператора new не освобождает тебя от указания перд скобками ТАПА, для которого выделяется память. Читай внимательно и больше гуляй по вечерам на свежем воздухе, стимулирует :)
Ответ отправлен: 13.12.2002, 03:00 Отправитель: Jadd Отвечает vitya
Добрый день, Sasha! Есть две большие разницы - оператор 1. new 2. new [] Вот первый ты перегрузил, а второй - нет. Перегрузи new [] - тогда не должно быть проблем.
Ответ отправлен: 12.12.2002, 13:54 Отправитель: vitya Отвечает Avl2k
Добрый день, Sasha! Для этого надо перегрузить еще и operator new[], см. приложение. Кстати, для полноты картины надо добавить, что operator new может быть вызван для выделения объекта "по месту" (см. там же). С уважением, Avl2k.
Приложение: Ответ отправлен: 15.12.2002, 11:02 Отправитель: Avl2k
Вопрос № 435
Ludi kak peregruzit operator new[]. esli mozhno privedite primer
Доброе время суток, sasha! Блин, только что писал одном неумехе. Открой книгу по С++ и посмотри. Ну, а коли нету, смотри как мастера делают (не я :) ) в объявлении класса: void* operator new[] (size_t); в реализации: void* SomeClass::operator new(size_t size) { return malloc(size); } вот и все.
Удачи Ответ отправлен: 13.12.2002, 02:42 Отправитель: Jadd
Вопрос № 436
Sdraste Mozhno li peregruzit operator new[]. esli net to kak peregruzit operator new tak chto bi onsrabotal pri vizove object *x=new[10]; Idea pisat tak Object *x=new[10]; i chtobi v classe Object v kazhdom iz sozdannih ekzemplyarov vizvalas function-operator. prosba otvetit na e-mail.
Добрый день, sasha! Впринципе, любой оператор можно перегрузить, почти. New не исключение. Его можно свободно перегрузить под нужды пользователя. Вот хрестоматийный пример: в объявлении класса: void *operator new [] (size_t); далее по реализации: void* MyClass::operator new(size_t size) { return malloc(size); } Стоит заметить, что вызов оператора new не осовобождает программера, т.е. тебя, указывать ТИП выделяемой памяти. Т.е. пример: SomeRect *pRect; pRect = new SomeRect[SomeSize]; Это лишь пример, но если ты заменишь по шаблону на твои типы, то получишь то, что надо. Поверь, это - именно хрестоматийные истины. В любой толковой книге по С++ это описано. Удачи. Ответ отправлен: 13.12.2002, 02:34 Отправитель: Jadd
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.