Здравствуйте, Аноним, Вы писали:
А>Подскажите пожалуйста как оптимизировать код чтобы меньше плодить кода и случайно не опечататься ...
Посмотри, например, в сторону 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
...
А>
Что будет если в точке 1 возникнет исключение ?
Re[3]: new delete NULL
От:
Аноним
Дата:
26.01.09 14:10
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:
А>>Как вариант: А>>
А>>int *mas1 = new int [100];
А>>double *mas2 = new double[101];
А>>float *mas2 = new float [103]; // 1
ЮЖ>...
А>>
ЮЖ>Что будет если в точке 1 возникнет исключение ?
Упс, утечка
Умные указатели, коллекции и компактные функции рулят!
Re[4]: new delete NULL
От:
Аноним
Дата:
26.01.09 14:30
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Юрий Жмеренецкий, Вы писали:
А>>>Как вариант: А>>>
А>>>int *mas1 = new int [100];
А>>>double *mas2 = new double[101];
А>>>float *mas2 = new float [103]; // 1
ЮЖ>>...
А>>>
ЮЖ>>Что будет если в точке 1 возникнет исключение ?
А>Упс, утечка А>Умные указатели, коллекции и компактные функции рулят!
Причем здесь утечка? Исли в точке 1 вылетит исключение, Вам уже ничего не поможет, приложение нужно завершать.
А>Причем здесь утечка? Исли в точке 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.