|
IAR 4.41A & C++ |
|
|
|
Sep 21 2007, 08:13
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719

|
Имеем простой классический код: Код class TMenu { public: TMenu(); ~TMenu(); int Show(int); private: char menu[7][17]; int x,width,len,ptr; };
TMenu *m=new TMenu(); m->Show(1); delete m; Компилируется отлично, без ошибок. Пишем в камень (AT91SAM7XC256), радуемся красивому зависанию. До оператора new все работает, затем просто виснет проц. Объявление в статике все решает, но держать в памяти много объектов не очень здорово. Писать для каждого нового меню отдельную процедуру, чтобы держать все в стеке тоже не очень - тогда с классами нет необходимости возиться. Думал, что там с heap проблема - никаких. malloc() работает.
--------------------
Сомневаюсь, и вам советую!
|
|
|
|
|
 |
Ответов
|
Sep 21 2007, 12:07
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719

|
J-Link запустил с горем пополам. Короче нашел где ступор - когда вызывает new, заходит в malloc, после чего в abort где и находит бесконечный branch сам на себя.
--------------------
Сомневаюсь, и вам советую!
|
|
|
|
|
Sep 21 2007, 13:21
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719

|
Цитата(alexander55 @ Sep 21 2007, 15:28)  Ну теперь дело за малым прошагать malloc, а затем понять, что надо что-то поменять в icf файле. В каком файле? Может в .xcl? Так там задано 8000 под HEAP. Статически распределено около 9 кило, 64 всего у камня. После дебага я нашел, что и malloc не работает. Различия лишь в том, что malloc не входит в ступор, а new входит. Похоже, считает, что нет памяти в куче. Осталось найти, где копать. Однако фигово сделано - ни исключений, ничего. Просто бесконечный цикл, без возможности узнать, что памяти нет. Разобрался. По непонятной причине в оболочке писал 8000 хипа, а в файле было 100. Явно не хватало. И при этом все остальные параметры показывает правильно.
--------------------
Сомневаюсь, и вам советую!
|
|
|
|
|
Sep 24 2007, 04:35
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(mungo @ Sep 21 2007, 19:21)  Разобрался. По непонятной причине в оболочке писал 8000 хипа, а в файле было 100. Явно не хватало. И при этом все остальные параметры показывает правильно. По горячим следам. 1. Посмотрел тут ARM® IAR C/C++ Compiler Reference Guide на стр. 13 есть очень короткая глава Dynamic memory on the heap в ней раздел Potential problems. Сказано только как избежать исчерпания кучи, но не сказано, как ведут себя new. Не хорошо как-то... возникло чувство недоделанности не только руководства, но и самого компилятора. Жаль. 2. Ради спортивного интереса открыл к MSDN (MS VC++ 6.0) "If there is insufficient memory for the allocation request, by default operator new returns NULL. You can change this default behavior by writing a custom exception-handling routine and calling the _set_new_handler run-time library function with your function name as its argument." (Перевод мой) "Если для запроса нехватает памяти, то поумолчанию оператор new возвращает NULL. Вы можете изменить такое поведение путем создания своей подпрограммы-обработчика исключения и вызова библиотечной функции _set_new_handler (имеется ввиду из ран-тайм бибиотеки) с именем Вашей функции в качестве аргумента." 2 mungo -- Спасибо за обозначенные грабли. Будем иметь ввиду.
Сообщение отредактировал zhevak - Sep 24 2007, 04:36
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Sep 24 2007, 06:12
|
Частый гость
 
Группа: Новичок
Сообщений: 121
Регистрация: 15-08-06
Пользователь №: 19 557

|
Цитата(zhevak @ Sep 24 2007, 08:35)  Сказано только как избежать исчерпания кучи, но не сказано, как ведут себя new. Не хорошо как-то... возникло чувство недоделанности не только руководства, но и самого компилятора. Жаль. При исчерпании кучи new должен возвращать NULL. Так у всех, поэтому в руководстве про это и не писали. Можно добавить в программу проверку на NULL после new и вывод ошибки. Поможет избежать "загадочного" поведения.
|
|
|
|
|
Sep 24 2007, 06:34
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(Alexey Bishletov @ Sep 24 2007, 12:12)  При исчерпании кучи new должен возвращать NULL. Так у всех, поэтому в руководстве про это и не писали. Можно добавить в программу проверку на NULL после new и вывод ошибки. Поможет избежать "загадочного" поведения. Чуть выше Цитата Короче нашел где ступор - когда вызывает new, заходит в malloc, после чего в abort где и находит бесконечный branch сам на себя. А в самом первом посту Цитата До оператора new все работает, затем просто виснет проц. Я так понял, что new вообще не возвращает управление. Правда, это все со слов автора темы. Что там генерит ИАР-компайлер я не проверял -- нет под руками изделия, где бы можно было проверить отход опрератора new от всемирно принятых правил игры. Добавлять проверку на NULL нужно обязательно!. Для коммерческих программ для компов я это делаю в обязательном порядке, хотя там памяти -- умотаться. Но кто его знает, а вдруг при длительной эксплуатации (несколько недель, месяцев) память исчерпается, и что тогда? Позорный BSOD? А вот для АРМов проврека на NULL -- ну это просто жизненно необходимо!
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Sep 24 2007, 07:51
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(zltigo @ Sep 24 2007, 13:06)  Только перед этом нужно убедится в наличии лифта убедится, что установленный Вами или по умолчанию обработчик исключения по нехватке памяти этот самый NULL возвращает а не делает что-либо другое. Лифт -- О-о, эта аллегория мне нравится  Продолжим нашу священную "религиозную" войну. Я только одного не могу понять. Почему разработчики ИАР-компилятора сделали поведение new несколько отличное от стандарта и при этом никак не удосужились описать его? Может я не там читал? Почему архитекторы спроектировали такуй странный лифт, каждый раз входя в который нужно всегда убеждаться том, что он вообще является лифтом, а не сортиром -- "вошел и провалился". Что до меня, так после таких дел я вообще не хочу пользоваться в ИАРе этим лифтом (new).
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
Сообщений в этой теме
mungo IAR 4.41A & C++ Sep 21 2007, 08:13 alexander55 Цитата(mungo @ Sep 21 2007, 12:13) TMenu ... Sep 21 2007, 09:28 mungo Цитата(alexander55 @ Sep 21 2007, 12:28) ... Sep 21 2007, 09:52 jorikdima Цитата(alexander55 @ Sep 21 2007, 13:28) ... Sep 21 2007, 10:03  mungo Цитата(jorikdima @ Sep 21 2007, 13:03) Кр... Sep 21 2007, 10:12   zhevak Цитата(mungo @ Sep 21 2007, 16:12) Да, пр... Sep 21 2007, 10:37   alexander55 Цитата(mungo @ Sep 21 2007, 14:12) Да, пр... Sep 21 2007, 10:41 mungo Код 693 void xxx()
694 {
\ ... Sep 21 2007, 10:58 deadman А в конструкторе что? Sep 21 2007, 11:13 mungo Цитата(deadman @ Sep 21 2007, 14:13) А в ... Sep 21 2007, 11:18  Alexey Bishletov Видимо new и malloc все же различаются в части выд... Sep 21 2007, 11:38 mungo У меня тоже нету исходников. А пошагово зайти не м... Sep 21 2007, 11:43 Alechek Чтобы не стопорился, вызвать функцию до SysInit() ... Sep 21 2007, 11:57     zltigo Цитата(Alexey Bishletov @ Sep 24 2007, 09... Sep 24 2007, 06:29      alexander55 Я завелся (значит не прав), но проделал полезную р... Sep 24 2007, 07:02        zltigo Цитата(zhevak @ Sep 24 2007, 10:51) Я тол... Sep 24 2007, 08:04      Сергей Борщ Цитата(zhevak @ Sep 24 2007, 09:34) Я так... Sep 24 2007, 07:14       zhevak Цитата(Сергей Борщ @ Sep 24 2007, 13:14) ... Sep 24 2007, 08:30        zltigo Цитата(zhevak @ Sep 24 2007, 11:30) Да. Э... Sep 24 2007, 08:41        Сергей Борщ Цитата(zhevak @ Sep 24 2007, 11:30) Да. Э... Sep 24 2007, 10:34         zltigo Цитата(Сергей Борщ @ Sep 24 2007, 13:34) ... Sep 24 2007, 10:41   alexander55 Цитата(mungo @ Sep 21 2007, 17:21) В како... Sep 24 2007, 05:10
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|