Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на C / C++

Выпуск № 148
от 15.12.2002, 19:30

Администратор:
Имя: Nick.Box
URL: Информационный ресурс
ICQ: 365124
[censored], [censored]
О рассылке:
Задано вопросов: 442
Отправлено ответов: 970
Активность: 219.4 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

PL
Статус: Доверительный
Общий рейтинг: 114.28
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108.13
[Подробней >>]
Jadd
Статус: Профессиональный
Общий рейтинг: 143.8
[Подробней >>]
 
Avl2k
Статус: Доверительный
Общий рейтинг: 127.71
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 433. Приветствую! Как перехватывать ошибки при выделении памяти конструктором контейнера STL? Например, п... (ответов: 3)
Вопрос № 434. Sdraste . ya peregruzhau operator new kogda ya videlayu pamyat tak Object *x=new; vsio rabotaet, fun... (ответов: 3)
Вопрос № 435. Ludi kak peregruzit operator new[]. esli mozhno privedite primer... (ответов: 1)
Вопрос № 436. Sdraste Mozhno li peregruzit operator new[]. esli net to kak peregruzit operator new tak chto bi ons... (ответов: 1)

Вопросов: 4, ответов: 8


 Вопрос № 433

Приветствую!
Как перехватывать ошибки при выделении памяти конструктором контейнера STL?
Например, при выполнении следующей программы (Borland C++ 5.02, Win32 Console), если ввести достаточно большое число (500000000), выводится сообщение Abnormal program termination.


Приложение:


Вопрос отправлен: 11.12.2002, 20:59
Отправитель: Cursor (cursor1@narod.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает PL

Доброе время суток, 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



Вопрос отправлен: 12.12.2002, 13:46
Отправитель: Sasha (felistovichs@rambler.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Jadd

Здравствуйте, 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



Вопрос отправлен: 12.12.2002, 16:51
Отправитель: sasha (felistovichs@rambler.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Jadd

Доброе время суток, 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.



Вопрос отправлен: 12.12.2002, 18:44
Отправитель: sasha (felistovichs@rambler.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Jadd

Добрый день, 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.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (40)
C / C++ (30)
Perl (6)
Delphi (23)
Pascal (26)
Basic / VBA (11)
Java / JavaScript (9)
PHP (5)
MySQL / MSSQL (7)
Пользователю
Windows 95/98/Me (31)
Windows NT/2000/XP (22)
"Железо" (30)
Поиск информации (13)
Администратору
Windows NT/2000/XP (11)
Linux / Unix (15)
Юристу
Гражданское право (10)
Семейное право (3)
Трудовое право (6)
КоАП (3)

Отправить вопрос всем экспертам выбранной рассылки.




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное