Re[7]: new delete NULL
От: alzt  
Дата: 27.01.09 08:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если приложение не смогло выделить память в куче, это говорит о серьезных проблеммах. Дальнейшее продолженние приложенния может привести к не предсказуемой ситуации и не корректным результатам. Я за то, что бы завершаться, граммотно логироваться, исправлять ошибки и тчательно разбераться в причине приведящей к этому исключению.

А>И если еще брать во внемание раскрутку стека....

Исключение могло возникнуть не только при выделении памяти, но и в теле функции.
Re[8]: deadlock_malloc? :))) (-)
От: Erop Россия  
Дата: 27.01.09 09:07
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>PS: Есть способ "гарантированного" выделения памяти (с очевидными недостатками): т.н. non-null malloc (nn_malloc) — функция не возвращает управление до тех пор, пока не сможет выделить блок необходимого размера.


Ну-ну...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: deadlock_malloc? :))) (-)
От: Юрий Жмеренецкий ICQ 380412032
Дата: 27.01.09 09:27
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Юрий Жмеренецкий, Вы писали:


ЮЖ>>PS: Есть способ "гарантированного" выделения памяти ([b]с очевидными недостатками/[b])...

E>Ну-ну...
Re[2]: new delete NULL
От: Аноним  
Дата: 27.01.09 12:57
Оценка:
Здравствуйте, BossOJ, Вы писали:

BOJ>#define _DELETE_(p) { if(p) { delete (p);(p)=NULL; };};

BOJ>#define _DELETE_ARRAY_(p) { if(p) { delete [] (p);(p)=NULL; };};

Если уж юзать блоки в макросах, то так:
do{
   ...
}while(0)

или что бы ворнинги не надоедали:
do{
   ...
}while(0,0)
Re[3]: new delete NULL
От: Аноним  
Дата: 28.01.09 11:35
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Если уж юзать блоки в макросах, то так:

А>
А>do{
А>   ...
А>}while(0)

А>или что бы ворнинги не надоедали:
А>do{
А>   ...
А>}while(0,0)


Можете объяснить почему?
Re[4]: new delete NULL
От: Аноним  
Дата: 28.01.09 12:48
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>Если уж юзать блоки в макросах, то так:
А>>
А>>do{
А>>   ...
А>>}while(0)

А>>или что бы ворнинги не надоедали:
А>>do{
А>>   ...
А>>}while(0,0)

А>Можете объяснить почему?

Вызов макроса становится больше похож на вызов функции.
Например в таких случаях:
inline  void MYFUNC(int x){}
#define MYMACRO1(x) {}
#define MYMACRO2(x) {};
#define MYMACRO3(x) do{}while(0)
...........
...........
...........
if(x)
    MYFUNC(1);
else
    MYFUNC(2);
//============
if(x) 
    MYMACRO1(1) //обязательно без ";"
else
    MYMACRO1(2)
//============
if(x){
    MYMACRO2(1) //обязательно с "{}"
}else{
    MYMACRO2(2)
}
//============
if(x)
    MYMACRO3(1); //так же как и для функций
else
    MYMACRO3(2);

MYFUNC(0);
MYMACRO1(0)
MYMACRO2(0)
MYMACRO3(0); //обязательно с ";" (как и для функций)

Впоследствии это позволит безболезненно заменить макрос функцией
+ код получается более единообразным.
Re[5]: new delete NULL
От: Аноним  
Дата: 29.01.09 08:20
Оценка:
Здравствуйте, Аноним, Вы писали:
Классно! Не знал. Спасибо
Re[2]: new delete NULL
От: cencio Украина http://ua-coder.blogspot.com
Дата: 29.01.09 08:34
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, <Аноним>, Вы писали:


А>>Подскажите пожалуйста как оптимизировать код чтобы меньше плодить кода и случайно не опечататься ...


OE>Умные указатели в C++
Автор(ы): Igor Semenov
Дата: 17.07.2008
В этой статье приводится обзор инструментов, позволяющих избежать части проблем, связанных с использованием динамической памяти в C++. Описанные ниже инструменты и методики не являются панацеей от проблем управления памятью, они всего лишь способны облегчить жизнь программисту при условии правильного их использования. Эти инструменты носят общее название «умные указатели» («smart pointers»), что подразумевает их семантическое сходство с обыкновенными указателями C++.


очень харошая статья, там первый идет описание auto_ptr, человек ее прочитает и сделает
вместо
mas1 = new int[100]


вот так
auto_ptr<int*> mas1(new int[100]);


а что, в статье не написано, почему так нельзя
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.