Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа оператора delete[] 
:(
    Опции темы
Vyacheslav
Дата 3.5.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Earnest,  извините. Наверное Ваше сообщение призвано прикратить офтоп, но я рискну продолжить. 
Здесь уже вопрос затронут не о применении STL, а о том что  уважаемый Mayk пытается неумение написать код списать на якобы имеющиеся недостатки языковых конструкций.  С моей точки зрения это просто возмутительно smile Похоже все эти примочки произвели на него неизгладимое впечатление, что он уверен, что  применение их способно выправить кривизну рук 
Итак , уважаемый Mayk, Вы можете пояснить в чем ненадежность данного кода?
Код

void foo() throw (std::exception)
{
char *pchar = new [1000];
// далее следует небезопасный код
// который может сгенерить std::exception
try{
//....

}
catch( std::exception& exp )
{
  delete [] pchar;
  // обработка  ошибок  по дизайну происходит не здесь
  throw;

delete [] pchar;
}
 


Теперь и немного перепишем его, например , воспользуясь auto_ptr. Хотя  нет, auto_ptr в данном случае не совсем уместен. Поэтому мы воспользуемся своим. Возможно  класса этот немного некорректен, но для демонстрации сойдет
Код

// auto_ptr не пойдет
// 
template<class _Tp>
struct auto_aptr : public std::auto_ptr< _Tp>
{
   explicit auto_aptr( _Tp* __px  ):std::auto_ptr<_Tp>(__px) {}
   ~auto_aptr()  { reset();  }
    void reset(_Tp* __px=0) 
   { 
             _Tp* __pt = get();
             if (__px != __pt) 
                    delete[] __pt; 
             __set(__px); 
   }
} ;

void foo() throw (std::exception)
{
  auto_aptr<char > pchar(new  MyClass[1000]);
// далее следует небезопасный код
// который может сгенерить std::exception

//...

}
 
Уверяю Вас, что и в первом и во втором случае  код "абсолютно" надежен, несмотря на то что в том и другом случае  используются new[] и delete[], написанные ручками , но я, пожалуй,  соглашусь, что во втором случае он оказался немного "совершенней" что ли. И если  и тот и другой  мне попадут на  code review я приемлю с удовлетворением и ту и другую версию. Единственное, что я не приемлю, так это наличие "несовершенного кода" с наличем memory leak'ов. И дело тут не в совершенстве, или несовершестве, а банальной ошибке. 

Цитата(Mayk @  2.5.2007,  21:53 Найти цитируемый пост)
Наличие memory leak'ов свидетельствует о том, что код не является соврешенным, 

Наличие memory leak'ов  свидельствует не о том, что код не является совершенным, а том что он написан с ошибками smile .  
И будьте уверены, программисту на это будет указано. 

Цитата(Mayk @  2.5.2007,  21:53 Найти цитируемый пост)

Для примера --- QPtrCollection из QT(это базовый тип для коллекций указателей) имеет свойство autoDelete, при установке которого элементы данного контейнера будут delete'нуты. (знаю-знаю, delete отличается от delete[] --- суть не в этом, суть в том что иногда контейнер вполне успешно может контролировать жить элементам, или нет).
 

Ну знаете, а чего же нарываетесь  smile  ? Я не знаком с QPtrCollection, но предполагаю, что в случае, если я захочу воспользоваться этой коллекцией, для того чтобы держать указатели на массивы объектов , выделенные с помощью new[],  мне потребуется переопределить какую нибудь виртуальную функцию типа clear. А если  я этого опять же из-за кривизны рук не сделаю, то получу на этот раз абсолютный  (см АБСОЛЮТНЫЙ прил. 2. Достигший высшего предела; полный, совершенный. ) неработающий код smile




 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
archimed7592
Дата 4.5.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Anikmar, ни один менеджер памяти не рассчитан на такое... специально для этих целей придуманы boost::pool, boost::object_pool, Loki::SmallObj, etc.

Vyacheslav, волшебные контейнеры и смартпоинтеры как правило имеют automatic storage duration и потому автоматически освобождают память как только объект больше не нужен...

Добавлено через 8 минут и 51 секунду
Цитата(Vyacheslav @  3.5.2007,  12:09 Найти цитируемый пост)
  auto_aptr<char > pchar(new  MyClass[1000]);
Цитата(Vyacheslav @  3.5.2007,  12:09 Найти цитируемый пост)
Уверяю Вас, что и в первом и во втором случае  код "абсолютно" надежен, несмотря на то что в том и другом случае  используются new[] и delete[]
не откомпилится, а если сделать явное приведение указателей, чтобы компилилось, то надёжным уж явно не будет...

Цитата(Vyacheslav @  3.5.2007,  12:09 Найти цитируемый пост)
если  я этого опять же из-за кривизны рук не сделаю, то получу на этот раз абсолютный  (см АБСОЛЮТНЫЙ прил. 2. Достигший высшего предела; полный, совершенный. ) неработающий код smile
не знаю как обстоят дела QT, но в boost для это предусмотрены shared_ptr и shared_array...

Добавлено через 11 минут и 55 секунд
Цитата(Vyacheslav @  3.5.2007,  12:09 Найти цитируемый пост)
char *pchar = new [1000];
проглядел... нужно new char [1000]


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Anikmar
Дата 4.5.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(archimed7592 @  4.5.2007,  14:20 Найти цитируемый пост)
Anikmar, ни один менеджер памяти не рассчитан на такое... специально для этих целей придуманы boost::pool, boost::object_pool, Loki::SmallObj, etc.

Это понятно, если конечно приведенные контейнеры реализовывают это не через те же new и delete.
Просто vector, например, тут не поможет точно - я смотрел, там все через new и delete сделано, поэтому проблему фрагментации он не снимет.

По поводу приведенных классов - ничего не могу сказать, не знаю.

Там проблему пришлось решать на сколько я помню именно через свой менеджер памяти.
PM MAIL ICQ   Вверх
Vyacheslav
Дата 4.5.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(archimed7592 @  4.5.2007,  14:20 Найти цитируемый пост)
не откомпилится, а если сделать явное приведение указателей, чтобы компилилось, то надёжным уж явно не будет...

Естественно smile  Опечатался 
Имелось в виду
Код

auto_aptr<char > pchar(new char[1000]);

по аналогии с первым вариантом





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
archimed7592
Дата 4.5.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Anikmar @  4.5.2007,  14:38 Найти цитируемый пост)
Это понятно, если конечно приведенные контейнеры реализовывают это не через те же new и delete.
Просто vector, например, тут не поможет точно - я смотрел, там все через new и delete сделано, поэтому проблему фрагментации он не снимет.
неа... vector как раз рассчитан на это... есть такая штука, называется allocator... передаётся вторым или третьим шаблонным параметром вектору... по умолчанию - это std::allocator, который использует new/delete... есть два выхода из этой ситуации: перегрузить операторы new/delete (как это сделано в Loki::SmallObj - просто наследуешь от него и будет использоваться специализированный менеджер памяти), но это не всегда удобно - для int их не перегрузишь...
второй вариант - подменить аллокатор... например на boost::pool_aloc

Добавлено через 2 минуты и 17 секунд
Vyacheslav, и тем не менее... кривость рук в boost исправляется наличием разных смартпоинтеров для разных случаев (new vs new[]) ;)


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Gelos
Дата 5.5.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 29.4.2007

Репутация: нет
Всего: нет



Мда, дискуссия разрослась. Вобщем, немного поясню суть. Как, где-то было выше сказанно, выделялось постоянно в цикле большое колличество блоков памяти. Очень большое. То есть,  в файле было около 38000 записей, все они дробились на куски, и под куски выделялась память. И этот файл обрабатывался в цикле тоже около 39 тысяч раз.  Проверка пошаговая дебагером показала, что не смотря на то, что ко всем опереторам new вызываются delete к концу обработки вложенного цикла выедается на 6кб. и так дальше. 

Причем, конструкция (схематично) была такая 
while(1)
{
ukaz = new char[MAX];

----------
код 

---------
 delete [] ukaz;

}
После изменения констукции на

Bool flag = TRUE;
while(1)
{
if(!flag)
{
delete [] ukaz;
}
ukaz = new char[MAX];
flag = FALSE;
----------
код 

---------
 
}

утечка памяти исчезла.

PM MAIL   Вверх
Vyacheslav
Дата 6.5.2007, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(archimed7592 @  4.5.2007,  15:12 Найти цитируемый пост)
Vyacheslav, и тем не менее... кривость рук в boost 

Все таки останусь при своем мнении: "кривость рук" этим не исправляется, а маскируется.  Если Вы не научитесь грамотно писать код, то всякие ссылки типа: "А мне это делать не привык,потому, как за меня это буст делает"  вряд ли будут приняты в качестве аргумента в серьезной компании

Добавлено через 6 минут и 37 секунд
Цитата(Gelos @  5.5.2007,  22:47 Найти цитируемый пост)
утечка памяти исчезла.

Вообще в своей схеме Вы не указали самый главный момент: где производился выход из бесконечного цикла?.  Судя по
Код

while(1)
{
ukaz = new char[MAX];

// выход где-то здесь 
//

 delete [] ukaz;
}

явно до вызов последнего вызова delete. Отсюда и утечка 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
archimed7592
Дата 6.5.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Vyacheslav, зачем делать класс, который можно будет использовать неправильно, когда можно сделать два класса, которые как не крути - неправильно не поюзаешь... тем более, что в с++ это решается оч простым путём стратегий и два класса делать и не придётся:
Код
template < ... > class shared_ptr_base;
typedef shared_ptr_base < ..., usual_allocation, ... > shared_ptr;
typedef shared_ptr_base < ..., array_allocation, ... > shared_array;
не знаю, как это сделано в boost, но не думаю, что идея сильно отличается...

что же касается 
Цитата(Vyacheslav @  6.5.2007,  20:34 Найти цитируемый пост)
А мне это делать не привык,потому, как за меня это буст делает" вряд ли будут приняты в качестве аргумента в серьезной компании 
никто не спорит - во-первых, делать нужно уметь делать и так и эдак, во-вторых, привычка пользоваться мощными библиотеками не освобождает от надобности знания как эти библиотеки реализованны... а вот знание внутреннего устройства библиотеки - аргумент уже намного более серьёзный


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Earnest
Дата 7.5.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Vyacheslav @  3.5.2007,  13:09 Найти цитируемый пост)
Здесь уже вопрос затронут не о применении STL, а о том что  уважаемый Mayk пытается неумение написать код списать на якобы имеющиеся недостатки языковых конструкций. 

Я бы не сказала, что Mayk именно такую позицию защищает. Скорее, это твоя интерпретация его постов. А его проффесионализм и знание C++ у меня сомнений не вызывает.
Все, что я видела - это ратование за использование конструкций, облегчающих жизнь программистаи делающих C++ более безопасным. Лично я это тоже приветствую, и сама по другому давно не пишу (т.е. не помню, когда последний раз явно писала delete). 
Но у меня тоже есть ощущение, что такого рода конструкции скорее помешают начинающему программисту разобраться в языке, чем помогут. В том смысле, что у него просто не будет суровой необходимости, а любопытства может не хватить.
Это немного оффтоп, но по моему опыту, программисты, пришедшие из C, лучше въезжают и больше понимают, чем программисты, пришедшие из более высокоуровневых языков типа Жавы.
С другой стороны, если в проекте принято использование умных примочек (а я по опыту знаю, насколько это сокращает число потенциальных ошибок), то разрешать кому-то в целях обучения использовать голые new-delete
я не собираюсь...




--------------------
...
PM   Вверх
Gelos
Дата 7.5.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 29.4.2007

Репутация: нет
Всего: нет



Vyacheslav

Хм, а знаете, может быть и так, хотя,  по идее, выход у меня тогда, когда файл закончится. Может там и реально в самом конце выход случается раньше чем остатки выделенной памяти будут скормлены Ктулху...
PM MAIL   Вверх
Vyacheslav
Дата 9.5.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(archimed7592 @  6.5.2007,  20:48 Найти цитируемый пост)
Vyacheslav, зачем делать класс, который 

Извините,  но не стоит придираться к классу, который был написан на коленке для исключительно  конкретной демонстрации, причем посредством отнаследования от auto_ptr smile и который нигде кроме как в этой дискуссии не применялся smile

Цитата(Earnest @  7.5.2007,  11:10 Найти цитируемый пост)
Я бы не сказала, что Mayk именно такую позицию защищает. Скорее, это твоя интерпретация его постов. А его проффесионализм и знание C++ у меня сомнений не вызывает.

Мда ? Ну в таком случве исходя из этого совета
Цитата(Mayk @  1.5.2007,  22:52 Найти цитируемый пост)
а обязательно использовать эти ненадёжные new[]/delete[]'ы? 
контейнеры и smart pointerы не пойдут?

Вы не просветите меня , в чем заключается ненадежность new[]/delete[]. А то  я их использую, а вдруг мой код из-за них ненадежен? Нехорошо как то получается smile  А так же за одно просветите о ненадежности векторов. 
 Вообще в таком случае  "ненадежность"  new[]/delete[] я предлагаю решить кардинальным способом: мигрировать на С# ну или в крайнем случае на managed C++. Как Вам такой совет smile ? На мой вгляд он ни чем ни хуже перехода на  smart pointerы. Кстати  и изучение  еще одного языка также весьма может поднять профессионализм: если раньше человек не знал одного языка, то после с таким подходом будет не знать целых два. Прогресс налицо smile


Цитата(Earnest @  7.5.2007,  11:10 Найти цитируемый пост)
С другой стороны, если в проекте принято использование умных примочек (а я по опыту знаю, насколько это сокращает число потенциальных ошибок), то разрешать кому-то в целях обучения использовать голые new-delete
я не собираюсь...

А я  не мешаю использовать их другим во вполне серьезных проектах. И не  уверен, что отсутствие прямого вызова new-delete - признак ученического проекта. Не барское дело ломать стиль программирования своего подчиненного  через коленку, даже если и имеешь на это право. Со временем тот и сам поймет, как улучшить свой код.   Если программист что-то применяет, то он должен применять это осознанно и по делу, а  не потому что без этого он не способен написать грамотный код или потому что начальник сказал, что вот это круто. 
И кстати , мой Вам респект. Как Вам удается найти на работу столь профессиональный контингент, которые совершенно не требуют обучения? Меня на фирме привлекают очень часто в качестве технического интервьюера при приеме кандидатов и искренне рад, когда из 5 человек  хотя бы 1 показывает приемлимый уровень знаний  С++ в объеме, ограниченным книгой Страутрупа первого издания.  

Цитата(Earnest @  7.5.2007,  11:10 Найти цитируемый пост)
Лично я это тоже приветствую, и сама по другому давно не пишу (т.е. не помню, когда последний раз явно писала delete). 

smile  То есть если есть необходимость например использовать контейнеры с указателями, Вы заменяете их на контейнеры со smart  pointrerами? А я все по старинке :( : шаблонный функтор со стратегией для удаления и for_each.

 Ну и возвращаясь к нашей ситуации, когда человек спрашивает, почему у него происходят утечки и получает в ответ
Цитата(Mayk @  1.5.2007,  22:52 Найти цитируемый пост)
а обязательно использовать эти ненадёжные new[]/delete[]'ы? 
контейнеры и smart pointerы не пойдут?

выглядит весьма странно. Я не собираюсь оценивать профессионализм отвечающего, но  от совета попахивает немного ламерством
Вообще то,  задав  вопрос
Цитата(Vyacheslav @  2.5.2007,  13:37 Найти цитируемый пост)
А где в стандарте описывается вероятность, с которой должен "ненадёжный" delete[] должен освобожать память выделенную "ненадёжным" new[]   

я ожидал, что Mayk уточнит понятие "ненадежности" примерно так, как это сделал Anikmar
Цитата(Anikmar @  2.5.2007,  14:18 Найти цитируемый пост)
Пожалуй слово "ненадежный" надо употреблять к программеру.

и статус-кво злосчастных new[]/delete[]  и языка С++ в целом было бы восстановлено. Но уважаемый  Mayk упорно стал  защищать свою первоначальную формулировку,  присовокупив  к компании ненадежных еще  vector smile  только на том основании, что он не вызывает delete, если его элеметами являются указатели на объекты.

PS Gelos , прошу ни в коем случае не принимать данную дискуссию на свой счет. Это чисто теоретический спор.

 



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
skyboy
Дата 9.5.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



выдержка из книги "Наука отладки": "Изучение знаменитых(и не очень знаменитых) ошибок"
Это к тому, что не стоит настоятельную рекомендацию "более безопасных" конструкций воспринимать как потакание ламеризму и личную обиду smile просто порою важнее получить корректно работающий продукт с дополнительными "гарантиями" корректности, нежели потешить самолюбие разработчика("80 000 строк кода без единой отладки - и все правильно работает") ;) прошу не воспринимать последнее сказанное, Vyacheslav, на свой счет - обидеть не хотел.  Просто мне показалось, что причина "вспышки ярости" несравнима с поводом, а "повод" интерпретирован немного неверно smile
PM MAIL   Вверх
v_nikolaev
Дата 10.5.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 6.5.2007

Репутация: нет
Всего: нет



Цитата(Earnest @ 2.5.2007,  19:11)
Кроме утечек есть ведь такая вещь, как фрагментация памяти...

тут, наверное, следует говорить о фрагментации вместе с утечками
утечки памяти могут её усугублять:
пусть у нас хороший менеджкр хипа, который возвразщает операционке свободный непрерывный участок в конце своей памяти, но всё равно неподчищенная память мешает этому - на следующей фазе программа будет выделять опять то, что было невычищено - это усилит фрагментацию определённым образом. потом мы захотим выделять большие массивы, получится, что у нас нет возможности переиспользовать то, что зарезервировано.
я имел дело с прогой в VC, в которой сложилась такая ситуация - из-за невычищенного мегабайта выделялись новые 400M. это также сопровождалось интересным эффектом - d-версия работала быстрее release smile

но, возможно, дело совсем не в утечках.
ещё одна проблема - возможно менеджер хипа не объединяет свободные участки, начинают алокироваться структуры данных большего размера, и переиспользовать память не удаётся.


PM MAIL   Вверх
Earnest
Дата 10.5.2007, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Vyacheslav @  9.5.2007,  23:19 Найти цитируемый пост)
И кстати , мой Вам респект. Как Вам удается найти на работу столь профессиональный контингент, которые совершенно не требуют обучения?

А мне и не удается... Я их учу... А потом они сбегают в Москву, на ЗП, которую наша контора платить не может... :(

Цитата(Vyacheslav @  9.5.2007,  23:19 Найти цитируемый пост)
 То есть если есть необходимость например использовать контейнеры с указателями, Вы заменяете их на контейнеры со smart  pointrerами? А я все по старинке :( : шаблонный функтор со стратегией для удаления и for_each.

Да, всегда, если именно контейнер владеет объектами, а не просто хранит ссылки на объекты, живущие в другом месте.
Основание: да хотя бы применение удаляющих алгоритмов, типа remove_if. Где потом концы искать, если это динамические указатели?
Ваш функтор решит проблему только удаления на деструкторе (и в тех местах, где его можно явно включить - и еще не забыть надо это сделать).
Даже если я заранее не уверена, что буду применять алгоритмы, которые могут дублировать или удалять объекты, я все равно предпочитаю безопасные контейнеры, т.к. это проще, чем ломать себе голову, думая о последствиях. Более того, если объекты не полиморфные, я предпочитаю хранить в контейнере именно объекты, а не указатели, и черт с ним, с лишним копированием.
Все это позволяет сосредоточиться на алгоритме и логике. Раньше я напрягалась по поводу "лишних" действий, которые придется выполнять бедной железке. И сейчас иногда жаба душит. Но практика показывает, что реальные тормоза возникают вовсе не из-за такой фигни, а скорее из-за плохого, слишком тупого, алгоритма. А чем сложнее алгоритм, тем "самостоятельнее" должны быть данные.

Цитата(Vyacheslav @  9.5.2007,  23:19 Найти цитируемый пост)
Не барское дело ломать стиль программирования своего подчиненного  через коленку, даже если и имеешь на это право. Со временем тот и сам поймет, как улучшить свой код

Пока он будет сам это понимать, пользователи будут присылать сообщения об ошибке: "ваша программа попросила послать разработчику..."
Если трепетно относиться к такому стилю, так что же тогда сказать о манере называть переменные и расставлять скобки? 
Свов код пусть пишет как хочет (у себя дома), а код в проекте не его, а общий. И, скорее всего, поддерживаться будет совсем другими людьми.

А насчет Mayk'а, давай не будем его обсуждать: сам он к спору интерес явно потерял.



--------------------
...
PM   Вверх
Vyacheslav
Дата 10.5.2007, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(Earnest @  10.5.2007,  13:15 Найти цитируемый пост)
Пока он будет сам это понимать, пользователи будут присылать сообщения об ошибке: "ваша программа попросила послать разработчику..."
Если трепетно относиться к такому стилю, так что же тогда сказать о манере называть переменные и расставлять скобки? 

Это как раз определяется внутрикорпоративным стандартом кодирования smile .  Только стандарт кодирования не затрагивает обязательность применения тех или иных приемов smile, как Вы понимаете.  Более того, в слкчае офшорного программрования приходится использовать стандарт кодирования конкретного заказчика, но и там я ни разу не встречал рекомендации обязателной замен пары new/delete smart pointer'ами.

Цитата(Earnest @  10.5.2007,  13:15 Найти цитируемый пост)
Пока он будет сам это понимать, пользователи будут присылать сообщения об ошибке: "ваша программа попросила послать разработчику..."

Это как  раз из другой оперы.  И  какже быть с циклом разработки. в который неотъемлимой частью входит тестирование? 

Цитата(Earnest @  10.5.2007,  13:15 Найти цитируемый пост)
Ваш функтор решит проблему только удаления на деструкторе (и в тех местах, где его можно явно включить - и еще не забыть надо это сделать).

Забыть можно все что угодно, например тот же кошелек  дома. Но это еще не повод, чтобы  с вечера писать у себя на лбу : "Не забыть взять кошелек "  smile .  И если факт такой забывчивости вещь для конкретного программиста случайная, то ничего страшного. Свою ошибку он найдет сам при проведении unit тестирования, или его коллеги тестировщики.  И при нахождении ошибки код программы будет таким эе надежным, как и  с примененим строгих и умных указателей. А вот если для него такая забывчивость в порядке вещей, то тут надо не   переходить на более прогрессивные приемы программирования, а менять профиль работы. 



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
2 Пользователей читают эту тему (2 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1363 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.