Здравствуйте, PM, Вы писали:
PM>[тут был код очередного класса буфера] PM>Для меня new вне конструктора умного указателя (std::shared_ptr, std::unique_ptr или их аналогов из Boost) — признак плохого кода.
для меня new вне make_XXX для умного указателя — грабли. (ещё new легален в своих контейнерах)
используй make_unique, make_shared http://herbsutter.com/gotw/_102/
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>каждый четвёртый кандидат на должность C++ программиста, никогда не слышал о STL.
Странно. А выборка у Вас большая?
Возможно, это связано с тем, что не везде, где используется С++ получается использовать STL.
Или не используют именно по религиозным соображениям?
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>Сейчас приходится собеседовать много новичков. ШЕ>Заметил что ничего в жизни не меняется. ШЕ>Даже люди с опытом работы в крупных наступают на те же грабли, на которые наступал я в своё время.
ШЕ>Хочу представить такие рекомендации новичкам в C++. Для того чтобы вы могли повысить свой уровень ШЕ>ну и хотя бы лучше пройти собеседование.
ШЕ>Если кто желает что-то добавить — пожалуйста. ШЕ>Только просьба придерживаться таких соглашений:
ШЕ>- Это должны быть грабли, на которые наступают регулярно. ШЕ>- Краткое описание проблемы и методы её решение. ШЕ>- Обяснение причин. ШЕ>- Проверенный (скомпилированный) пример кода.
Я было начал отвечать на ваши сообщения, но потом понял, что пересказываю содержание книг Майерса и Саттера. Новичкам это бесполезно — они еще не наступили на все грабли, опытным С++ программистам это уже 10 лет как не интересно.
Так что новичкам я бы порекомендовал читать умные книги и писать реальный код
Здравствуйте, Abyx, Вы писали:
A>если С++03 — зачем функтор если достаточно функции
1) Если используются биндеры или адаптеры
2) Функтор умеет хранить значения, что иногда удобно. Например for_each возвращает объект переданный в качестве функции. Правда тут нужно быть осторожным, точно быть уверенным в том, что передаваесый объект не копируется внутри алгоритма.
3) Часто это более эфективно т.к. вызов можно сделать встраеваемым
Здравствуйте, ML380, Вы писали:
ML>Здравствуйте, Abyx, Вы писали:
A>>если С++03 — зачем функтор если достаточно функции
ML>1) Если используются биндеры или адаптеры ML>2) Функтор умеет хранить значения, что иногда удобно. Например for_each возвращает объект переданный в качестве функции. Правда тут нужно быть осторожным, точно быть уверенным в том, что передаваесый объект не копируется внутри алгоритма.
не надо вырезать код из моего поста.
зачем в *том* коде функтор?
ML>3) Часто это более эфективно т.к. вызов можно сделать встраеваемым
зависит от компилятора.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>>странно, что ты не понял — я не об особенностях определенной реализации С++ говорю, а о том, что люди на С++ пишут, как будто у них С или что похуже.
I>Мне в самом деле стало интересно, с самого ли начала в C++ или C с классами был деструктор.
I>А вот по поводу "как будто у них С" несогласен. На C, когда в функции выделяются русурсы, return как правило один — в конце. (Или его вообще нет, если функция ничего не возвращает.)
ну вот у удода — какой-то гибрид из С и С++, который можно назвать условно С с классами: вроде классы есть, а ничего больше от С++ он и не позаимствовал,
ресурсы освобождает вручную, как в С, а техники С с одним местом выхода — он и не знал никогда. недо С, недо С++, высер.
Of course, the code must be complete enough to compile and link.
Здравствуйте, PlusMyTwitterFace, Вы писали:
PMT>За что минус поясните? Мне не жалко, а действительно интересно.
падение программы на delete — это крайне редкое событие имхо
в моей практике я видел такие последствия:
1) утечка памяти, если массив содержит сложные объекты (из-за того, что не вызовутся деструкторы). при этом память под объекты (не включая их мемберов) будет освобождена
2) никаких проблем, если массив состоит из простых типов или POD-ов
то есть в таком коде на практике нет проблем:
int* x = new int[200];
delete x;
3) никаких проблем, если массив состоит из объектов, которые в деструкторах ничего умного не делают и не освобождают (включая автоматически сгенерированные деструкторы)
мой опят ограничен лишь работой с VS+gcc, возможно, где-то есть более печальные последствия из-за неправильного delete\delete[], но я не слышал о подобных проблемах
> Что правильно-то? Если нужен статический полиморфизм (времени компиляции), а не > динамический (времени выполнения), то как раз нужно использовать шаблоны, а не > наследование.
18.09.2012 13:44, Шебеко Евгений пишет:
> Если вы создаёте объект, то для его разрушения должны вызывать delete. > Если вы создаёте массив, то для его разрушения должны вызывать delete[]. > > item_t* v=new item_t; > ... > delete v; > > item_t* v=new item_t[100]; > ... > delete[] v;
Опять же, лучше использовать какой контейнер или *_ptr какой.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Копирующий конструктор и копирующий operator= по умолчанию.
Шебеко Евгений:
ШЕ>Если класс не содержит явного копирующего конструктора или operator=, то они создаются неявно. ШЕ>Об этом надо помнить.
.... ШЕ>Решение — сделать private копирующий конструктор и operator=. При этом достаточно их просто объявить, тело функций добавлять не надо.
C++11 пока, наверное, мало востребован, но, давая общие рекомендации по C++, совсем его игнорировать не стоит. В данном случае можно явно объявить копирующие функции как deleted, либо, что ещё лучше, добавить в класс пользовательский конструктор перемещения и (опционально) перемещающий оператор присваивания (неявно объявленные копирующие конструктор и оператор присваивания при этом автоматом будут считаться deleted, хотя для некоторых недоразвитых компиляторов =delete всё же придётся прописывать вручную).
18.09.2012 13:52, Шебеко Евгений пишет:
> Почему-то довольно часто приходится слышать от C++ программистов, что > они не используют стандартную библиотеку.
Потому что здесь количество велосипедопесателей зашкаливает в отличие от
JavaScript или PHP.
> Зато каждый четвёртый кандидат на должность C++ программиста, никогда не > слышал о STL.
Зато они могут написать сходу различные виду сортировки небось.
> Каждый второй кандидат на предложение отсортировать массив, предлагает > сортировку пузырьком!!! > Только два кандидата, с помощью гугла, смогли дать более-менее рабочий > код с использованием std::sort()
Потому что куча клоунов на собеседованиях именно просят реализовать
сортировку (об этом тут было море срачей) и очень обижаются, если им
предлагают библиотечный sort.
Здравствуйте, PM, Вы писали:
PM>Для меня new вне конструктора умного указателя (std::shared_ptr, std::unique_ptr или их аналогов из Boost) — признак плохого кода.
Не будь так категоричен, это признак недостатка опыта.
PM>В прикладном коде new/delete не нужен, для буфера есть std::vector<char> или его суженный аналог:
В прикладном — да, но бывает ещё и не-прикладной-код
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>соседушко по офису, дебил и неряха, десятилетиями пишет код вида: L_L>Спасает только статический анализатор, который заваливает этого ЛОШАРУ горами сообщений. L_L>Ес-но, фикся, кретин плодит новое говно и получает по тупой харе от анализатора и т.д. — имя этому процессу — бесконечность.
А куда смотрит тимлид и прочий менеджмент?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока