new delete NULL
От: Аноним  
Дата: 26.01.09 10:08
Оценка:
Подскажите пожалуйста как оптимизировать код чтобы меньше плодить кода и случайно не опечататься ...
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
}


добавлена разметка — Кодт
Re: new delete NULL
От: Bell Россия  
Дата: 26.01.09 10:31
Оценка: +1
Здравствуйте, Аноним, Вы писали:

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


Посмотри, например, в сторону 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
А>}


tеmplate<Class T>
inline void SAFE_DELETE(T*& buffer)
{
delete[] buffer;
buffer = NULL;
}

используем так:
SAFE_DELETE(mas1);
SAFE_DELETE(mas2);
SAFE_DELETE(mas3);
Re: new delete NULL
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 26.01.09 11:11
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

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


Умные указатели в C++
Автор(ы): Igor Semenov
Дата: 17.07.2008
В этой статье приводится обзор инструментов, позволяющих избежать части проблем, связанных с использованием динамической памяти в C++. Описанные ниже инструменты и методики не являются панацеей от проблем управления памятью, они всего лишь способны облегчить жизнь программисту при условии правильного их использования. Эти инструменты носят общее название «умные указатели» («smart pointers»), что подразумевает их семантическое сходство с обыкновенными указателями C++.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[2]: new delete NULL
От: alzt  
Дата: 26.01.09 11:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>tеmplate<Class T>

А>inline void SAFE_DELETE(T*& buffer)
А>{
А> delete[] buffer;
А> buffer = NULL;
А>}

А>используем так:

А>
А>SAFE_DELETE(mas1);
А>SAFE_DELETE(mas2);
А>SAFE_DELETE(mas3);
А>


int* p = new int(666);
SAFE_DELETE(p);//realy safe?
Re: new delete NULL
От: Аноним  
Дата: 26.01.09 12:37
Оценка:
Здравствуйте, Аноним, Вы писали:

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


Как вариант:
int    *mas1 = new int   [100];
double *mas2 = new double[101];
float  *mas2 = new float [103];

А>//Тело функции..

delete [] mas1;
mas1 = NULL

delete [] mas2;
mas2 = NULL

delete [] mas3;
mas3 = NULL

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

A>
A>int* p = new int(666);
A>

Если вы пишете такой код, у вас большие проблеммы
Re[2]: new delete NULL
От: Юрий Жмеренецкий ICQ 380412032
Дата: 26.01.09 14:01
Оценка: +1
Здравствуйте, Аноним, Вы писали:

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


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


А>Как вариант:

А>
А>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 вылетит исключение, Вам уже ничего не поможет, приложение нужно завершать.
Re[5]: new delete NULL
От: Vamp Россия  
Дата: 26.01.09 14:35
Оценка:
А>Причем здесь утечка? Исли в точке 1 вылетит исключение, Вам уже ничего не поможет, приложение нужно завершать.
Строго говоря, не обязательно. У приложения может быть огромный пул памяти, которую оно использует, и если операция выделения памяти сорвалась, можно задействовать оттуда. Приложение может попробовать выделить кусок поменьше и поработать с ним. Варианты есть.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: new delete NULL
От: Аноним  
Дата: 26.01.09 14:44
Оценка:
Здравствуйте, Vamp, Вы писали:

А>>Причем здесь утечка? Исли в точке 1 вылетит исключение, Вам уже ничего не поможет, приложение нужно завершать.

V>Строго говоря, не обязательно. У приложения может быть огромный пул памяти, которую оно использует, и если операция выделения памяти сорвалась, можно задействовать оттуда. Приложение может попробовать выделить кусок поменьше и поработать с ним. Варианты есть.

Если приложение не смогло выделить память в куче, это говорит о серьезных проблеммах. Дальнейшее продолженние приложенния может привести к не предсказуемой ситуации и не корректным результатам. Я за то, что бы завершаться, граммотно логироваться, исправлять ошибки и тчательно разбераться в причине приведящей к этому исключению.
И если еще брать во внемание раскрутку стека....
Re[7]: new delete NULL
От: Vamp Россия  
Дата: 26.01.09 14:53
Оценка: +1
А>Если приложение не смогло выделить память в куче, это говорит о серьезных проблеммах. Дальнейшее продолженние приложенния может привести к не предсказуемой ситуации и не корректным результатам.

Совершенно необязательно. Это говорит нам только о том, что на данный момент доступной памяти нет. Можно много чего сделать, начиная от отмены текущей операции и до попытки использования памяти из другого места.
Представь, что приложение — это веб-сервер. И памяти не хватило для обработки очередного запроса? Что лучше — прибить веб сервер целиком, или отказать конкретно этому запрашивающему, а к тому времени, как он запросит еще раз, десяток других запросов успеют завершиться и память освободится?
Да здравствует мыло душистое и веревка пушистая.
Re: new delete NULL
От: BossOJ Россия  
Дата: 26.01.09 23:34
Оценка: -1
#define _DELETE_(p) { if(p) { delete (p);(p)=NULL; };};
#define _DELETE_ARRAY_(p) { if(p) { delete [] (p);(p)=NULL; };};
Re[2]: new delete NULL
От: K13 http://akvis.com
Дата: 27.01.09 05:06
Оценка:
BOJ>#define _DELETE_(p) { if(p) { delete (p);(p)=NULL; };};
BOJ>#define _DELETE_ARRAY_(p) { if(p) { delete [] (p);(p)=NULL; };};

Угу, и потом заюзать примерно вот так:
_DELETE(p++);
удивившись результату

Макросы в С++ нужны только там, где никак не выкрутиться шаблонными (инлайновыми) функциями.
Выше уже приводилось нормальное решение.
Re[2]: new delete NULL
От: Юрий Жмеренецкий ICQ 380412032
Дата: 27.01.09 05:14
Оценка:
Здравствуйте, BossOJ, Вы писали:

BOJ>#define  _DELETE_(p)  { if(p) { delete (p);(p)=NULL; };};
//  ^0      1^             2^^^^^             3^^^^^^^^^ 4^5^


0) Макрос лишает возможности передавать всю конструкцию в качестве функтора.
1) Такие имена являются зарезервированными
2) delete успешно обрабатывает передачу NULL
3) Принудительно-обязательное обнуление требуется не всегда.
4,5) ';' — лишняя.

Нет проверки на неполный тип.
Re[7]: new delete NULL
От: Юрий Жмеренецкий ICQ 380412032
Дата: 27.01.09 05:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Vamp, Вы писали:


А>>>Причем здесь утечка? Исли в точке 1 вылетит исключение, Вам уже ничего не поможет, приложение нужно завершать.

V>>Строго говоря, не обязательно. У приложения может быть огромный пул памяти, которую оно использует, и если операция выделения памяти сорвалась, можно задействовать оттуда. Приложение может попробовать выделить кусок поменьше и поработать с ним. Варианты есть.

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

Это говорит только о том что в момент выделения не оказалось блока памяти запрашиваемого размера. Серьезная это проблема для приложения, или нет — без контекста сказать нельзя.
...
А>И если еще брать во внемание раскрутку стека....
В процессе раскрутки стека наверняка произойдет освобождение используемых ресурсов/памяти.

PS: Есть способ "гарантированного" выделения памяти (с очевидными недостатками): т.н. non-null malloc (nn_malloc) — функция не возвращает управление до тех пор, пока не сможет выделить блок необходимого размера.
Re: new delete NULL
От: catBasilio  
Дата: 27.01.09 06:42
Оценка:
Здравствуйте, Аноним, Вы писали:

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

А>
А>int *mas1 = NULL;
А>double *mas2 = NULL;
А>float *mas3 = NULL;
...
А>


Вариант 1. с векторами

  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.


   std::auto_ptr_array<int> mas1(new int[100]);
   std::auto_ptr_array<double> mas2(new double[101]);
   std::auto_ptr_array<float> mas3(new float[103]);

   ...



ну ты понал, в случае варианта 2 там еще немного с напильником поработать надо.
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re: new delete NULL
От: MescalitoPeyot Украина  
Дата: 27.01.09 07:17
Оценка:
Разве не 5.3.5?

If the value of the operand of delete is the null pointer the operation
has no effect

... << RSDN@Home 1.2.0 alpha 4 rev. 1136>>
Re[4]: new delete NULL
От: alzt  
Дата: 27.01.09 08:14
Оценка:
Здравствуйте, Аноним, Вы писали:

A>>
A>>int* p = new int(666);
A>>

А>Если вы пишете такой код, у вас большие проблеммы

В чём именно проблемы?

Хороший интерфейс должен решать многие проблемы. В том числе и проблему дурака.
Кроме этого, на месте встроенного типа мог быть пользовательский.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.