Здравствуйте, Аноним, Вы писали:
А>Подскажите пожалуйста как оптимизировать код чтобы меньше плодить кода и случайно не опечататься ...
Посмотри, например, в сторону std::vector (стандартная библиотека).
Любите книгу — источник знаний (с) М.Горький
Re: new delete NULL
От:
Аноним
Дата:
26.01.09 10:41
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Подскажите пожалуйста как оптимизировать код чтобы меньше плодить кода и случайно не опечататься ...
А>int *mas1 = NULL; А>double *mas2 = NULL; А>float *mas3 = NULL;
А>mas1 = new int[100]; А>mas2 = new double[101]; А>mas2 = new float[103];
А>//Тело функции..
А>if(mas1) А>{ А> delete [] mas1; А> mas1 = NULL А>} А>if(mas2) А>{ А> delete [] mas2; А> mas2 = NULL А>} А>if(mas3) А>{ А> delete [] mas3; А> mas3 = NULL А>}
А>Можно ли как то сделать функцию Delete(), которая бы выполняла схожие операции для всех типов массивов? А>if(NameMassive) А>{ А> delete [] NameMassive; А> NameMassive = NULL А>}
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>Подскажите пожалуйста как оптимизировать код чтобы меньше плодить кода и случайно не опечататься ...
А>Как вариант: А>
А>int *mas1 = new int [100];
А>double *mas2 = new double[101];
А>float *mas2 = new float [103]; // 1
...
А>
А>Если приложение не смогло выделить память в куче, это говорит о серьезных проблеммах. Дальнейшее продолженние приложенния может привести к не предсказуемой ситуации и не корректным результатам.
Совершенно необязательно. Это говорит нам только о том, что на данный момент доступной памяти нет. Можно много чего сделать, начиная от отмены текущей операции и до попытки использования памяти из другого места.
Представь, что приложение — это веб-сервер. И памяти не хватило для обработки очередного запроса? Что лучше — прибить веб сервер целиком, или отказать конкретно этому запрашивающему, а к тому времени, как он запросит еще раз, десяток других запросов успеют завершиться и память освободится?
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>>PS: Есть способ "гарантированного" выделения памяти ([b]с очевидными недостатками/[b])... E>Ну-ну...
new delete NULL
От:
Аноним
Дата:
26.01.09 10:08
Оценка:
Подскажите пожалуйста как оптимизировать код чтобы меньше плодить кода и случайно не опечататься ...
А>Причем здесь утечка? Исли в точке 1 вылетит исключение, Вам уже ничего не поможет, приложение нужно завершать.
Строго говоря, не обязательно. У приложения может быть огромный пул памяти, которую оно использует, и если операция выделения памяти сорвалась, можно задействовать оттуда. Приложение может попробовать выделить кусок поменьше и поработать с ним. Варианты есть.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: new delete NULL
От:
Аноним
Дата:
26.01.09 14:44
Оценка:
Здравствуйте, Vamp, Вы писали:
А>>Причем здесь утечка? Исли в точке 1 вылетит исключение, Вам уже ничего не поможет, приложение нужно завершать. V>Строго говоря, не обязательно. У приложения может быть огромный пул памяти, которую оно использует, и если операция выделения памяти сорвалась, можно задействовать оттуда. Приложение может попробовать выделить кусок поменьше и поработать с ним. Варианты есть.
Если приложение не смогло выделить память в куче, это говорит о серьезных проблеммах. Дальнейшее продолженние приложенния может привести к не предсказуемой ситуации и не корректным результатам. Я за то, что бы завершаться, граммотно логироваться, исправлять ошибки и тчательно разбераться в причине приведящей к этому исключению.
И если еще брать во внемание раскрутку стека....
0) Макрос лишает возможности передавать всю конструкцию в качестве функтора.
1) Такие имена являются зарезервированными
2) delete успешно обрабатывает передачу NULL
3) Принудительно-обязательное обнуление требуется не всегда.
4,5) ';' — лишняя.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Vamp, Вы писали:
А>>>Причем здесь утечка? Исли в точке 1 вылетит исключение, Вам уже ничего не поможет, приложение нужно завершать. V>>Строго говоря, не обязательно. У приложения может быть огромный пул памяти, которую оно использует, и если операция выделения памяти сорвалась, можно задействовать оттуда. Приложение может попробовать выделить кусок поменьше и поработать с ним. Варианты есть.
А>Если приложение не смогло выделить память в куче, это говорит о серьезных проблеммах.
Это говорит только о том что в момент выделения не оказалось блока памяти запрашиваемого размера. Серьезная это проблема для приложения, или нет — без контекста сказать нельзя.
... А>И если еще брать во внемание раскрутку стека....
В процессе раскрутки стека наверняка произойдет освобождение используемых ресурсов/памяти.
PS: Есть способ "гарантированного" выделения памяти (с очевидными недостатками): т.н. non-null malloc (nn_malloc) — функция не возвращает управление до тех пор, пока не сможет выделить блок необходимого размера.
std::vector<int> mas1(100);
std::vector<double> mas2(101);
std::vector<float> mas3(103);
...
mas[1] = 1;
myfunc(&mas1[0], mas1.size()); // работа как со стандартным массивом.
Варивнт 2. с auto_ptr. // может не работать на некоторых компиляторах!!! в таком случае нужно сделать std::auto_ptr_array у которго в деструкторе вместо delete ptr будет delete[] ptr.
Здравствуйте, Аноним, Вы писали:
А>Если приложение не смогло выделить память в куче, это говорит о серьезных проблеммах. Дальнейшее продолженние приложенния может привести к не предсказуемой ситуации и не корректным результатам. Я за то, что бы завершаться, граммотно логироваться, исправлять ошибки и тчательно разбераться в причине приведящей к этому исключению. А>И если еще брать во внемание раскрутку стека....
Исключение могло возникнуть не только при выделении памяти, но и в теле функции.
Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>PS: Есть способ "гарантированного" выделения памяти (с очевидными недостатками): т.н. non-null malloc (nn_malloc) — функция не возвращает управление до тех пор, пока не сможет выделить блок необходимого размера.
Ну-ну...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Odi$$ey, Вы писали:
OE>Здравствуйте, <Аноним>, Вы писали:
А>>Подскажите пожалуйста как оптимизировать код чтобы меньше плодить кода и случайно не опечататься ...
OE>Умные указатели в C++