Re[3]: Копирующий конструктор и копирующий operator= по умолчанию.
От: Piko  
Дата: 18.09.12 12:43
Оценка: 1 (1)
Здравствуйте, PM, Вы писали:

PM>[тут был код очередного класса буфера]

PM>Для меня new вне конструктора умного указателя (std::shared_ptr, std::unique_ptr или их аналогов из Boost) — признак плохого кода.

для меня new вне make_XXX для умного указателя — грабли. (ещё new легален в своих контейнерах)
используй make_unique, make_shared http://herbsutter.com/gotw/_102/
Re[2]: Поймите и используйте STL
От: ML380 Земля  
Дата: 18.09.12 12:45
Оценка:
Здравствуйте, Шебеко Евгений, Вы писали:

ШЕ>каждый четвёртый кандидат на должность C++ программиста, никогда не слышал о STL.


Странно. А выборка у Вас большая?
Возможно, это связано с тем, что не везде, где используется С++ получается использовать STL.
Или не используют именно по религиозным соображениям?
Re: TOP граблей С++ для новичков
От: PM  
Дата: 18.09.12 12:54
Оценка: +1
Здравствуйте, Шебеко Евгений, Вы писали:

ШЕ>Сейчас приходится собеседовать много новичков.

ШЕ>Заметил что ничего в жизни не меняется.
ШЕ>Даже люди с опытом работы в крупных наступают на те же грабли, на которые наступал я в своё время.

ШЕ>Хочу представить такие рекомендации новичкам в C++. Для того чтобы вы могли повысить свой уровень

ШЕ>ну и хотя бы лучше пройти собеседование.

ШЕ>Если кто желает что-то добавить — пожалуйста.

ШЕ>Только просьба придерживаться таких соглашений:

ШЕ>- Это должны быть грабли, на которые наступают регулярно.

ШЕ>- Краткое описание проблемы и методы её решение.
ШЕ>- Обяснение причин.
ШЕ>- Проверенный (скомпилированный) пример кода.

Я было начал отвечать на ваши сообщения, но потом понял, что пересказываю содержание книг Майерса и Саттера. Новичкам это бесполезно — они еще не наступили на все грабли, опытным С++ программистам это уже 10 лет как не интересно.

Так что новичкам я бы порекомендовал читать умные книги и писать реальный код
Re[3]: Поймите и используйте STL
От: ML380 Земля  
Дата: 18.09.12 13:02
Оценка:
Здравствуйте, Abyx, Вы писали:

A>если С++03 — зачем функтор если достаточно функции


1) Если используются биндеры или адаптеры
2) Функтор умеет хранить значения, что иногда удобно. Например for_each возвращает объект переданный в качестве функции. Правда тут нужно быть осторожным, точно быть уверенным в том, что передаваесый объект не копируется внутри алгоритма.
3) Часто это более эфективно т.к. вызов можно сделать встраеваемым
Re[4]: Поймите и используйте STL
От: Abyx Россия  
Дата: 18.09.12 13:11
Оценка:
Здравствуйте, ML380, Вы писали:

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


A>>если С++03 — зачем функтор если достаточно функции


ML>1) Если используются биндеры или адаптеры

ML>2) Функтор умеет хранить значения, что иногда удобно. Например for_each возвращает объект переданный в качестве функции. Правда тут нужно быть осторожным, точно быть уверенным в том, что передаваесый объект не копируется внутри алгоритма.

не надо вырезать код из моего поста.
зачем в *том* коде функтор?

ML>3) Часто это более эфективно т.к. вызов можно сделать встраеваемым

зависит от компилятора.
In Zen We Trust
Re[6]: TOP граблей С++ для новичков
От: Lorenzo_LAMAS  
Дата: 18.09.12 13:19
Оценка:
Здравствуйте, igna, Вы писали:

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


L_L>>странно, что ты не понял — я не об особенностях определенной реализации С++ говорю, а о том, что люди на С++ пишут, как будто у них С или что похуже.


I>Мне в самом деле стало интересно, с самого ли начала в C++ или C с классами был деструктор.


I>А вот по поводу "как будто у них С" несогласен. На C, когда в функции выделяются русурсы, return как правило один — в конце. (Или его вообще нет, если функция ничего не возвращает.)


ну вот у удода — какой-то гибрид из С и С++, который можно назвать условно С с классами: вроде классы есть, а ничего больше от С++ он и не позаимствовал,
ресурсы освобождает вручную, как в С, а техники С с одним местом выхода — он и не знал никогда. недо С, недо С++, высер.
Of course, the code must be complete enough to compile and link.
Re[2]: forward declaration и оператор delete
От: rg45 СССР  
Дата: 18.09.12 13:23
Оценка:
Здравствуйте, Шебеко Евгений, Вы писали:

ШЕ>delete не может вызвать деструктор для тех объектов, чьё объявление классов он не видит.


Что ты понимаешь под "объявлением класса"?
--
Справедливость выше закона. А человечность выше справедливости.
Re: TOP граблей С++ для новичков
От: Шахтер Интернет  
Дата: 18.09.12 14:01
Оценка: +2 :)))
Здравствуйте, Шебеко Евгений, Вы писали:

ШЕ>Сейчас приходится собеседовать много новичков.


Вам слишком рано ещё кого-то собеседовать.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[2]: delete и delete[] различаются
От: PlusMyTwitterFace  
Дата: 18.09.12 14:51
Оценка: -1
ШЕ>Либо осовободится только один объект, либо программа упадёт.

Будет UB. Хотя, как правило, именно указанное Вами поведение встречается в большинстве реализаций.
Re[2]: Виртуальный деструктор
От: PlusMyTwitterFace  
Дата: 18.09.12 14:51
Оценка:
ШЕ>Иначе деструктор потомка не будет вызван.

Опять же будет UB. Хотя, как правило, именно указанное Вами поведение встречается в большинстве реализаций.
Re[3]: delete и delete[] различаются
От: PlusMyTwitterFace  
Дата: 18.09.12 15:21
Оценка:
За что минус поясните? Мне не жалко, а действительно интересно.
Re[4]: delete и delete[] различаются
От: uzhas Ниоткуда  
Дата: 18.09.12 15:32
Оценка: +2
Здравствуйте, PlusMyTwitterFace, Вы писали:

PMT>За что минус поясните? Мне не жалко, а действительно интересно.


падение программы на delete — это крайне редкое событие имхо
в моей практике я видел такие последствия:
1) утечка памяти, если массив содержит сложные объекты (из-за того, что не вызовутся деструкторы). при этом память под объекты (не включая их мемберов) будет освобождена
2) никаких проблем, если массив состоит из простых типов или POD-ов
то есть в таком коде на практике нет проблем:
int* x = new int[200];
delete x;

3) никаких проблем, если массив состоит из объектов, которые в деструкторах ничего умного не делают и не освобождают (включая автоматически сгенерированные деструкторы)
мой опят ограничен лишь работой с VS+gcc, возможно, где-то есть более печальные последствия из-за неправильного delete\delete[], но я не слышал о подобных проблемах
Re[4]: Книги
От: MasterZiv СССР  
Дата: 18.09.12 15:34
Оценка:
> Что правильно-то? Если нужен статический полиморфизм (времени компиляции), а не
> динамический (времени выполнения), то как раз нужно использовать шаблоны, а не
> наследование.

О книге сказано правильно.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: delete и delete[] различаются
От: Vzhyk  
Дата: 18.09.12 15:39
Оценка:
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= по умолчанию.
От: Masterkent  
Дата: 18.09.12 15:40
Оценка: +1
Шебеко Евгений:

ШЕ>Если класс не содержит явного копирующего конструктора или operator=, то они создаются неявно.

ШЕ>Об этом надо помнить.
....
ШЕ>Решение — сделать private копирующий конструктор и operator=. При этом достаточно их просто объявить, тело функций добавлять не надо.

C++11 пока, наверное, мало востребован, но, давая общие рекомендации по C++, совсем его игнорировать не стоит. В данном случае можно явно объявить копирующие функции как deleted, либо, что ещё лучше, добавить в класс пользовательский конструктор перемещения и (опционально) перемещающий оператор присваивания (неявно объявленные копирующие конструктор и оператор присваивания при этом автоматом будут считаться deleted, хотя для некоторых недоразвитых компиляторов =delete всё же придётся прописывать вручную).
Re[2]: Поймите и используйте STL
От: Vzhyk  
Дата: 18.09.12 15:47
Оценка:
18.09.2012 13:52, Шебеко Евгений пишет:

> Почему-то довольно часто приходится слышать от C++ программистов, что

> они не используют стандартную библиотеку.
Потому что здесь количество велосипедопесателей зашкаливает в отличие от
JavaScript или PHP.

> Зато каждый четвёртый кандидат на должность C++ программиста, никогда не

> слышал о STL.
Зато они могут написать сходу различные виду сортировки небось.

> Каждый второй кандидат на предложение отсортировать массив, предлагает

> сортировку пузырьком!!!
> Только два кандидата, с помощью гугла, смогли дать более-менее рабочий
> код с использованием std::sort()
Потому что куча клоунов на собеседованиях именно просят реализовать
сортировку (об этом тут было море срачей) и очень обижаются, если им
предлагают библиотечный sort.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: delete и delete[] различаются
От: PlusMyTwitterFace  
Дата: 18.09.12 15:47
Оценка: 1 (1)
Да, согласен, извиняюсь. Но UB имеет место быть, а дальнейшее обсуждение UB — это уже что-то бессмысленное, на мой взгляд.
Re[5]: Книги
От: igna Россия  
Дата: 18.09.12 15:51
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>О книге сказано правильно.


Ну ты же сказал "все правильно", значит и это: "Александреску призывает разумно использовать шаблоны и не заменять ими наследование."
Re[3]: Копирующий конструктор и копирующий operator= по умолчанию.
От: CreatorCray  
Дата: 18.09.12 18:31
Оценка: 1 (1) +1
Здравствуйте, 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, значит пора закрыть эту страницу.
Всем пока
Re[2]: TOP граблей С++ для новичков
От: CreatorCray  
Дата: 18.09.12 18:31
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>соседушко по офису, дебил и неряха, десятилетиями пишет код вида:

L_L>Спасает только статический анализатор, который заваливает этого ЛОШАРУ горами сообщений.
L_L>Ес-но, фикся, кретин плодит новое говно и получает по тупой харе от анализатора и т.д. — имя этому процессу — бесконечность.

А куда смотрит тимлид и прочий менеджмент?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.