boost троллинг
От: ezdoctor  
Дата: 14.09.12 09:19
Оценка: 22 (5) +1 -2 :)
Что произойдет (желательно решать аналитически)?
class a {
public:
    ~a(){printf("~a");}
}

class b : public a {
public:
    ~b(){printf("~b");}
}

class c : public b {
public:
    ~c(){printf("~c");}
}

main() {
    bool boolean = false;
    shared_ptr<a> p(boolean? new b: new c);
}

добавлена разметка — Кодт
Re: boost троллинг
От: Piko  
Дата: 14.09.12 09:29
Оценка: -2 :)
Здравствуйте, ezdoctor, Вы писали:

E>Что произойдет (желательно решать аналитически)?


кто-то узнал как работает тернарный оператор, и решил что rsdn это его уютненький бложек?
Re[2]: boost троллинг
От: ezdoctor  
Дата: 14.09.12 09:35
Оценка: -1
Уютный или неуютный, но предыдущее замечание смесь хамства и флуда.
Неинтересно --- иди дальше. А лично мне интересно знать мнение остальных по поводу того, насколько оправдан стандарт shared_ptr с учетом результатов данного примера.
Кстати, если знаешь, как работает тернарный оператор, так дай свой ответ, блестни эрудицией.

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

P>кто-то узнал как работает тернарный оператор, и решил что rsdn это его уютненький бложек?
Re[3]: boost троллинг
От: Piko  
Дата: 14.09.12 10:09
Оценка: -1
Здравствуйте, ezdoctor, Вы писали:

E>Уютный или неуютный, но предыдущее замечание смесь хамства и флуда.


топику с таким названием, самое место в КСВ

E>Неинтересно --- иди дальше.


дядя, это не твой бложек — захочу пройду, захочу камень кину

E>А лично мне интересно знать мнение остальных по поводу того, насколько оправдан стандарт shared_ptr с учетом результатов данного примера.


что конкретно тебя смущает?

E>Кстати, если знаешь, как работает тернарный оператор, так дай свой ответ, блестни эрудицией.


хинт — посмотри какой тип у выражения с тернарным оператором
Re[3]: boost троллинг
От: rusted Беларусь  
Дата: 14.09.12 10:09
Оценка: +1
Здравствуйте, ezdoctor, Вы писали:

E>А лично мне интересно знать мнение остальных по поводу того, насколько оправдан стандарт shared_ptr с учетом результатов данного примера.


Вопрос скорее в том, насколько оправдано использование тернарного оператора для инициализации shared_ptr указателем на объект без виртуального деструктора в этом случае. И вообще использования тернарного оператора во всех других случаях, когда тип третьего параметра не совпадает с типом второго.
Re: boost троллинг
От: dilmah США  
Дата: 14.09.12 10:12
Оценка: +8
осталось узнать при чем тут буст
Re[4]: Smart vs. raw
От: Qbit86 Кипр
Дата: 14.09.12 10:13
Оценка: 12 (1)
Здравствуйте, Piko, Вы писали:

P>что конкретно тебя смущает?


Возможно, топик-стартера смущает, что поведение умного указателя не совпадает с поведением сырого:
std::cout << typeid(boolean ? new b : new c).name() << std::endl;
{
    std::shared_ptr<a> p(boolean ? new b : new c);
}
std::cout << std::endl;
{
    a const* const p(boolean ? new b : new c);
    delete p;
}
std::cout << std::endl;
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: Smart vs. raw
От: Piko  
Дата: 14.09.12 10:17
Оценка: -1
Здравствуйте, Qbit86, Вы писали:

P>>что конкретно тебя смущает?

Q>Возможно, топик-стартера смущает,

я хз что у него на уме

Q>что поведение умного указателя не совпадает с поведением сырого:


IMO, поведение умного указателя должно быть как минимум не хуже поведения сырого. если лучше — проблемы нет.
Re[6]: boost::scoped_ptr
От: Qbit86 Кипр
Дата: 14.09.12 10:20
Оценка:
Здравствуйте, Piko, Вы писали:

P>я хз что у него на уме :xz:


Я к тому, что тип тернарного оператора и отсутствие виртуального деструктора, вроде, лежат на поверхности. А deleter smart_ptr'а (но не scoped_ptr'а, например!) спрятан глубже.

Кстати, надо будет на собеседованиях спрашивать.
Глаза у меня добрые, но рубашка — смирительная!
Re[7]: boost::scoped_ptr
От: Piko  
Дата: 14.09.12 10:35
Оценка:
Здравствуйте, Qbit86, Вы писали:

P>>я хз что у него на уме

Q>Я к тому, что тип тернарного оператора и отсутствие виртуального деструктора, вроде, лежат на поверхности.

http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr

Proper delete expression corresponding to the supplied type is always selected, this is the reason why the constructors are implemented as templates using a separate parameter Y.


http://www.boost.org/doc/libs/1_51_0/libs/smart_ptr/shared_ptr.htm

This constructor has been changed to a template in order to remember the actual pointer type passed. The destructor will call delete with the same pointer, complete with its original type, even when T does not have a virtual destructor, or is void.


Q>А deleter smart_ptr'а (но не scoped_ptr'а, например!) спрятан глубже.


Допустим кандидат не читал доку shared_ptr (что не есть хорошо, разумеется), допустим он не знает, что тот использует delete на supplied type pointer,
и что такого сверх ужасного может надевелопить такой кандидат с shared_ptr, учитывая то, что в этом вопросе он будет закладываться на семантику сырого указателя?
Re[8]: boost::scoped_ptr
От: Qbit86 Кипр
Дата: 14.09.12 10:43
Оценка:
Здравствуйте, Piko, Вы писали:

P>и что такого сверх ужасного может надевелопить такой кандидат с shared_ptr, учитывая то, что в этом вопросе он будет закладываться на семантику сырого указателя?


Но ты согласен, что поднятый (хоть и в тролловатой форме) топик-стартером вопрос чуть интереснее изначального вердикта «тернарный оператор/виртуальный деструктор» (даже если топик-стартер об этом не подозревает)? Так что я призываю убрать бомбочку с топика.
Глаза у меня добрые, но рубашка — смирительная!
Re[9]: boost::scoped_ptr
От: Piko  
Дата: 14.09.12 10:52
Оценка:
Здравствуйте, Qbit86, Вы писали:

P>>и что такого сверх ужасного может надевелопить такой кандидат с shared_ptr, учитывая то, что в этом вопросе он будет закладываться на семантику сырого указателя?

Q>Но ты согласен, что поднятый (хоть и в тролловатой форме) топик-стартером вопрос чуть интереснее изначального вердикта «тернарный оператор/виртуальный деструктор» (даже если топик-стартер об этом не подозревает)?

нет, не согласен, если бы тип указателя не "запоминался", то и тернарный оператор тут был бы совсем не причём.

Q>Так что я призываю убрать бомбочку с топика.


мне пофиг.
но что конкретно тебе интересно? может лучше создать отдельный топик, на конкретный аспект?
Re[10]: boost::scoped_ptr
От: Qbit86 Кипр
Дата: 14.09.12 11:03
Оценка:
Здравствуйте, Piko, Вы писали:

P>но что конкретно тебе интересно?


Мне это всё понятно. Речь про топик-стартера.

P>нет, не согласен, если бы тип указателя не "запоминался", то и тернарный оператор тут был бы совсем не причём.


Тернарный оператор «при чём» — но самого по себе этого недостаточно, чтобы была понятна в этом контексте разница в поведении boost::shared_ptr и boost::scoped_ptr — нужны как раз те цитаты про шаблон конструктора с отдельным параметром.
Глаза у меня добрые, но рубашка — смирительная!
Re[11]: boost::scoped_ptr
От: ezdoctor  
Дата: 14.09.12 11:13
Оценка: :)
От топик стартера: этот пример был придуман для обоснования того, что не стоит на собеседовании затрагивать тему shared_ptr. Никто из собеседователей не смог правильно ответить на вопрос "что выдаст программа" и все были изрядно удивлены результатам экспериментов с реальным компилятором.
Замечу, что никто из ответивших в теме не рискнул четко и ясно сказать, что программа выдаст, предпочти отослать к стандарту и просто обхамить. Сомнений в том, что выдаст программа, ни у кого нет, у всех только сомнения в том "что имел в виду топик стартер". Оставайтесь при своем "мнении".
Re[12]: boost::scoped_ptr
От: Piko  
Дата: 14.09.12 11:22
Оценка:
Здравствуйте, ezdoctor, Вы писали:

E>Замечу, что никто из ответивших в теме не рискнул четко и ясно сказать, что программа выдаст, предпочти отослать к стандарту и просто обхамить. Сомнений в том, что выдаст программа, ни у кого нет, у всех только сомнения в том "что имел в виду топик стартер". Оставайтесь при своем "мнении".


действительно сомнений нет — разве не очевидно, раз здесь обсуждается и deleter и тернарный оператор
в чём проблема то?
А кто тебя вообще к стандарту тут посылал, ты бредишь?
Re[11]: boost::scoped_ptr
От: Piko  
Дата: 14.09.12 11:24
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Тернарный оператор «при чём» — но самого по себе этого недостаточно, чтобы была понятна в этом контексте разница в поведении boost::shared_ptr и boost::scoped_ptr — нужны как раз те цитаты про шаблон конструктора с отдельным параметром.


то что в scoped_ptr нет deleter'а — да, нужно знать
я вот немного не пойму, ты знал что в shared_ptr есть deleter и "правильный" конструктор, или нет?
Re[12]: boost::scoped_ptr
От: Piko  
Дата: 14.09.12 11:28
Оценка:
Здравствуйте, ezdoctor, Вы писали:

E>Замечу, что никто из ответивших в теме не рискнул четко и ясно сказать, что программа выдаст, предпочти отослать к стандарту и просто обхамить. Сомнений в том, что выдаст программа, ни у кого нет, у всех только сомнения в том "что имел в виду топик стартер". Оставайтесь при своем "мнении".


да, и кстати, разве не очевидно, что раз говорится про тернарный оператор в данном контексте, то известно, что его тип на что-то влияет.
а говорится, буквально во втором сообщении.
так, что щёки можешь сдуть
Re[12]: boost::scoped_ptr
От: Qbit86 Кипр
Дата: 14.09.12 11:28
Оценка:
Здравствуйте, Piko, Вы писали:

P>я вот немного не пойму, ты знал что в shared_ptr есть deleter и "правильный" конструктор, или нет?


Знал, в том числе и про deleter'ы или их отсутствие (в контексте неполных типов при удалении — ошибка компиляции/undefined behavior/безопасное поведение) для auto_ptr, unique_ptr и scoped_ptr.
Глаза у меня добрые, но рубашка — смирительная!
Re[13]: boost::scoped_ptr
От: Piko  
Дата: 14.09.12 11:30
Оценка:
Здравствуйте, Qbit86, Вы писали:

P>>я вот немного не пойму, ты знал что в shared_ptr есть deleter и "правильный" конструктор, или нет?

Q>Знал, в том числе и про deleter'ы или их отсутствие (в контексте неполных типов при удалении — ошибка компиляции/undefined behavior/безопасное поведение) для auto_ptr, unique_ptr и scoped_ptr.

да уж, необходимость в checked_delete немного напрягает..
Re[12]: boost::scoped_ptr
От: Qbit86 Кипр
Дата: 14.09.12 11:36
Оценка: +1
Здравствуйте, ezdoctor, Вы писали:

Злой ты какой-то.

E>От топик стартера: этот пример был придуман для обоснования того, что не стоит на собеседовании затрагивать тему shared_ptr.


Бред. Не только можно, но и нужно.

E>Сомнений в том, что выдаст программа, ни у кого нет...


Сомнений может не быть, только если заранее знаешь (или задним числом, постфактум), на что была задача. А так сомнения есть, конечно же. Кажется, что задача на виртуальные деструкторы; а вдруг выяснится, что на унарный плюс или там на неполные типы (например, не в этом случае).

E>...у всех только сомнения в том "что имел в виду топик стартер".


И это, очевидно, вина топик-стартера. Нормальные люди ожидают вопросов с подразумеваемыми пунктами: 1) ожидаемое поведение, 2) фактическое поведение, 3) попытка объяснить поведение и запрос мнения форумчан.

E>Никто из собеседователей не смог правильно ответить на вопрос "что выдаст программа" и все были изрядно удивлены результатам экспериментов с реальным компилятором.


Это совершенно нормально, и вообще вполне ожидаемый эффект. Это как раз затравка для продолжения собеседования.

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


Ты какой-то странный, навязываешь тут какие-то челленджи, предлагаешь «реверсить» свой вопрос, чтобы понять, что же конкретно ты имел в виду.
Глаза у меня добрые, но рубашка — смирительная!
Re[13]: boost::scoped_ptr
От: ezdoctor  
Дата: 14.09.12 11:50
Оценка: 1 (1) :)
Повторю: этот вопрос я задал людям, которые проводят собеседования. То есть они задают другим вопросы про shared_ptr, при этом сами не знают его внутреннего устройства (и умудряются отказывать в приеме на работу).

Уж не знаю, кто тут более злой, я или Piko, но все-таки я ожидал увидеть добрые ответы в форме "Думаю, что программа выдаст вот это:..." И это уже собирался использовать в качестве затравки для хорошего теоретического вопроса. Кстати, мне нравится манера повествования Саттера: задать вопрос на обдумывание, а потом уже объяснять.

В общем, увы, продолжать нет ни смысла, ни желания.
Re[14]: Саттер молодец
От: Qbit86 Кипр
Дата: 14.09.12 11:56
Оценка: +1
Здравствуйте, ezdoctor, Вы писали:

E>То есть они задают другим вопросы про shared_ptr, при этом сами не знают его внутреннего устройства (и умудряются отказывать в приеме на работу).


Это печально, сожалею.

E>Кстати, мне нравится манера повествования Саттера: задать вопрос на обдумывание, а потом уже объяснять.


Саттер молодец [x]

E>В общем, увы, продолжать нет ни смысла, ни желания.


Собственно, твоё желание не так уж важно, и без тебя нормально обсудили, развили, и прошлись примерами по смежным темам.

Ты не нужен :)
Глаза у меня добрые, но рубашка — смирительная!
Re[15]: Boost и троллинг
От: Qbit86 Кипр
Дата: 14.09.12 11:58
Оценка: 6 (1) +1
Q>Ты не нужен :)

А нет, постой, не уходи. Объясни всё же, при чём тут Boost и троллинг?
Глаза у меня добрые, но рубашка — смирительная!
Re: Думаю, что со всех локальных дисков удалят boost?.. Не, не угадал?
От: Erop Россия  
Дата: 14.09.12 12:03
Оценка:
Здравствуйте, ezdoctor, Вы писали:

E>Что произойдет (желательно решать аналитически)?


UB произойдёт... так как ты удалишь экземпляр не имеющего виртуального деструктора класса С, через указатель на его базу B.

Теперь встречный вопрос, а что ты подразумевал под "желательно решать аналитически"?
Ведь UB "аналитически" обозначает произвольное поведение?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: boost::scoped_ptr
От: Erop Россия  
Дата: 14.09.12 12:05
Оценка:
Здравствуйте, Piko, Вы писали:

P>Допустим кандидат не читал доку shared_ptr (что не есть хорошо, разумеется), допустим он не знает, что тот использует delete на supplied type pointer,

P>и что такого сверх ужасного может надевелопить такой кандидат с shared_ptr, учитывая то, что в этом вопросе он будет закладываться на семантику сырого указателя?

Он может
1) Неверно истолковать код при поддержке и наколбасить каких-то "исправлений".
2) Может посмотреть на примеры имеющегося кода и сделать сопи-пастипо аналогии, при этом, он может допустить ошибку, аналогичную той, на которую намекает ТС...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[14]: boost::scoped_ptr
От: Piko  
Дата: 14.09.12 12:06
Оценка:
Здравствуйте, ezdoctor, Вы писали:

E>Повторю: этот вопрос я задал людям, которые проводят собеседования.


хм, а где это есть в исходном сообщении?

E>То есть они задают другим вопросы про shared_ptr, при этом сами не знают его внутреннего устройства (и умудряются отказывать в приеме на работу).


это какая-то обида говорит.
радуйся, что не работаешь с такими идиотами — собеседование оно ведь не только для проверки знаний собеседуемого.

E>Уж не знаю, кто тут более злой, я или Piko, но все-таки я ожидал увидеть добрые ответы в форме "Думаю, что программа выдаст вот это:..."


ну выдал бы я сразу правильный ответ, и что?

E>И это уже собирался использовать в качестве затравки для хорошего теоретического вопроса. Кстати, мне нравится манера повествования Саттера: задать вопрос на обдумывание, а потом уже объяснять.


Guru of the week, хренов, ещё раз посмотри как Саттер задаёт вопросы, и сравни с тем, как ты задал тут.
Re[2]: Думаю, что со всех локальных дисков удалят boost?.. Не, не угадал?
От: ezdoctor  
Дата: 14.09.12 12:23
Оценка:
Ну хоть один человек нормальный ответ дал вместо хамства. Насчет "аналитически" да, погорячился.

P.S. Задавать на собеседовании вопрос "напишите реализацию shared_ptr" можно только если сам понимаешь, как он должен работать в таком контексте. Иначе лучше все-таки просить реализовывать что попроще...

P.P.S. Может я и вправду сегодня не в настроении, но только мне одному сейчас кажется, что rsdn превратился в помойку?
Re[3]: Думаю, что со всех локальных дисков удалят boost?.. Не, не угадал?
От: Piko  
Дата: 14.09.12 12:31
Оценка:
Здравствуйте, ezdoctor, Вы писали:

E>P.P.S. Может я и вправду сегодня не в настроении, но только мне одному сейчас кажется, что rsdn превратился в помойку?


может стоит получше оформлять ТС сообщения? а то пахнет д'Артанизмом
Re[3]: Насколько оправдан стандарт shared_ptr
От: Qbit86 Кипр
Дата: 14.09.12 12:34
Оценка: 6 (1) +1
Здравствуйте, ezdoctor, Вы писали:

E>P.S. Задавать на собеседовании вопрос "напишите реализацию shared_ptr" можно только если сам понимаешь, как он должен работать в таком контексте. Иначе лучше все-таки просить реализовывать что попроще...


Судя по топику («boost троллинг») и первому комментарию («насколько оправдан стандарт shared_ptr с учетом результатов данного примера») создалось впечатление, что ты не согласен с реализацией в Буст, и ожидаешь подтверждения своему мнению. Не получив оного, ты начал рассказывать про какое-то собеседование («не стоит на собеседовании затрагивать тему shared_ptr»), где наниматели неучи, а соискатель весь в белом. Как-то это всё подозрительно.
Глаза у меня добрые, но рубашка — смирительная!
Re: boost троллинг
От: Mazay Россия  
Дата: 14.09.12 12:41
Оценка: :)
Здравствуйте, ezdoctor, Вы писали:

E>Что произойдет (желательно решать аналитически)?


E>skip


С тернарным оператором всё правильно. Странно другое. Вот более изолированный пример:
#include <cstdio>
#include <boost/shared_ptr.hpp>

class a {
public:
~a(){printf("~a");}
};

class b : public a {
public:
~b(){printf("~b");}
};

main() {
    {
        a *pa = new b;
        delete pa;            /// prints ~a, as expected
    }
    printf("\n\n\n");
    {
        boost::shared_ptr<a> p(new b); /// prints ~b~a, WTF?! I expected ~a too!
    }
}


Я полагал, что явно задавая тип-параметр в шаблоне, я явно указываю тип будущего деструктора. А на самом деле что получается??
Главное гармония ...
Re[2]: Изолированный пример
От: Qbit86 Кипр
Дата: 14.09.12 12:44
Оценка:
Здравствуйте, Mazay, Вы писали:

M>С тернарным оператором всё правильно. Странно другое. Вот более изолированный пример


http://www.rsdn.ru/forum/cpp/4892257
Автор: Qbit86
Дата: 14.09.12
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: boost троллинг
От: Piko  
Дата: 14.09.12 12:49
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Я полагал, что явно задавая тип-параметр в шаблоне, я явно указываю тип будущего деструктора. А на самом деле что получается??


shared_ptr всегда хранит deleter, для этого достаточно посмотреть на: template< class T > class shared_ptr;
раз его нет в параметрах шаблона класса, и его можно задать, то он всегда есть внутри.
а раз он есть всегда, то желательно использовать его по максимуму
Re[3]: Изолированный пример
От: Mazay Россия  
Дата: 14.09.12 12:51
Оценка:
Здравствуйте, Qbit86, Вы писали:

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


M>>С тернарным оператором всё правильно. Странно другое. Вот более изолированный пример


Q>http://www.rsdn.ru/forum/cpp/4892257
Автор: Qbit86
Дата: 14.09.12


Да, точно, только для демонстрации странности можно ещё выкинуть третий тип, булеву переменную, тернарный оператор и конст-ы.
Главное гармония ...
Re[2]: Тип-параметр в шаблоне
От: Qbit86 Кипр
Дата: 14.09.12 12:53
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Я полагал, что явно задавая тип-параметр в шаблоне, я явно указываю тип будущего деструктора. А на самом деле что получается??


Почти так и есть. Только тут играет роль не явно задаваемый тип «a» в шаблоне класса, а неявно задаваемый тип «b» в шаблоне конструктора класса.
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: Насколько оправдан стандарт shared_ptr
От: ezdoctor  
Дата: 14.09.12 12:56
Оценка:
Блин, накинулись . А еще утверждают, что глаза добрые

Я не соискатель и не собеседую. Речь о том, что (как выяснилось) мало кто знает о том, как в реальности shared_ptr хранит внутри указатель. Даже те, кто просит на собеседовании написать его реализацию.

У меня остается открытым вопрос, хорошо ли то, что shared_ptr оказывается умнее, чем многие, кто им пытается пользоваться. Если для многих неочевидно, что даже в отсутствие виртуального деструктора будет производиться удаление derived типа, то не факт, что это хорошо.
Re[4]: Третий тип
От: Qbit86 Кипр
Дата: 14.09.12 13:16
Оценка: +1
Здравствуйте, Mazay, Вы писали:

M>Да, точно, только для демонстрации странности можно ещё выкинуть третий тип...


А ты знаешь, нет! Третий тип добавляет примеру изящества.

Если взять не столь умный указатель, то вызовется «~a».
Если сделать дтор виртуальным, то вызовется «~c». Это вполне понятно и для многих ожидаемо; создаётся впечатление, что кроме этих двух крайних вариантов (корень и лист иерархии) других исходов быть не может.
И только если взять слишком умный указатель (а тем более спрятать тип промежуточного наследника за тернарным оператором), получаем вдруг «~b» — что-то среднее. Красивый результат.
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Думаю, что со всех локальных дисков удалят boost?.. Не, не угадал?
От: Vzhyk  
Дата: 14.09.12 13:22
Оценка: -1
14.09.2012 15:23, ezdoctor пишет:

> P.P.S. Может я и вправду сегодня не в настроении, но только мне одному

> сейчас кажется, что rsdn превратился в помойку?
Не помойку, а место для оттачивания мастерства троллинга.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Третий тип
От: ezdoctor  
Дата: 14.09.12 13:27
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>И только если взять слишком умный указатель (а тем более спрятать тип промежуточного наследника за тернарным оператором), получаем вдруг «~b» — что-то среднее. Красивый результат.


Ну наконец-то моя мысль понята. Каюсь, UB я упустил, но после демонстрации данного примера я слышу стандартное восклицание: "А как такое может быть?..", и только это заставляет людей всерьез задуматься об организации shared_ptr.
Re[5]: Насколько оправдан стандарт shared_ptr
От: Piko  
Дата: 14.09.12 13:27
Оценка:
Здравствуйте, ezdoctor, Вы писали:

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


то есть не знающий человек предположет, что будет удаление по base , и напишет код с UB ?
или ты про Егорины сценарии?
Re[5]: Для многих неочевидно...
От: Qbit86 Кипр
Дата: 14.09.12 13:27
Оценка:
Здравствуйте, ezdoctor, Вы писали:

E>Речь о том, что (как выяснилось) мало кто знает о том, как в реальности shared_ptr хранит внутри указатель. Если для многих неочевидно, что даже в отсутствие виртуального деструктора будет производиться удаление derived типа, то не факт, что это хорошо.


Знаешь, это как в анекдоте про лектора. Который говорит: «Это утверждение очевидно!», потом задумчиво смотрит на доску минут 40 и говорит: «Да, действительно очевидно.» Это к тому, что даже отлично зная все составляющие этой задачи по отдельности, в условиях собеседования придётся изрядно поскрипеть мозгами, прежде чем раскусить её в такой формулировке.
Глаза у меня добрые, но рубашка — смирительная!
Re[6]: Для многих неочевидно...
От: ezdoctor  
Дата: 14.09.12 13:38
Оценка: -2
Здравствуйте, Qbit86, Вы писали:

Q>Знаешь, это как в анекдоте про лектора. Который говорит: «Это утверждение очевидно!», потом задумчиво смотрит на доску минут 40 и говорит: «Да, действительно очевидно.» Это к тому, что даже отлично зная все составляющие этой задачи по отдельности, в условиях собеседования придётся изрядно поскрипеть мозгами, прежде чем раскусить её в такой формулировке.


Это НЕ задача для собеседования. Этот вопрос был задан в качестве троллинга людям, которые недавно просили кандидатов на собеседованиях реализовать shared_ptr. Ответ они давали быстро, причем неправильный со всех точек зрения. Когда я этот вопрос вынес в rsdn, мне было интересно понять, все ли настолько самонадеяны, и многие ли знают реальное положение вещей.

P.S. Не бывает глупых вопросов, бывают глупые ответы...
Re[3]: Думаю, что со всех локальных дисков удалят boost?.. Не, не угадал?
От: Erop Россия  
Дата: 14.09.12 13:48
Оценка: +2
Здравствуйте, ezdoctor, Вы писали:

E>P.P.S. Может я и вправду сегодня не в настроении, но только мне одному сейчас кажется, что rsdn превратился в помойку?


Ну я бы вот очень хотел иметь фичу "чёрный списко", которая бы фильтровала бы таки сообщения от ряда лиц

С другой стороны, ты сам как бы не по делу провакационно написал в профильный форум, но хотел, что тебе отвечали корректно?..

17.09.12 23:47: Перенесено из 'C/C++'
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Для многих неочевидно...
От: Qbit86 Кипр
Дата: 14.09.12 13:54
Оценка:
Здравствуйте, ezdoctor, Вы писали:

E>Это НЕ задача для собеседования. Этот вопрос был задан в качестве троллинга людям, которые недавно просили кандидатов на собеседованиях реализовать shared_ptr. Ответ они давали быстро, причем неправильный со всех точек зрения. Когда я этот вопрос вынес в rsdn, мне было интересно понять, все ли настолько самонадеяны, и многие ли знают реальное положение вещей.


Так не суть важно, для собеседования, или в качестве троллинга людям, или в RSDN. Ведь услышав быстрый неправильный ответ, ты так и не выяснишь, знает ли человек про устройство shared_ptr. Вопрос хоть и хороший, но не показательный.

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


Всё-таки, надо смотреть в ту сторону, что в общем случае shared_ptr зовёт не деструктор, а произвольный заданный при создании deleter. Этот удалятор может быть никак не связан с деструктором базового типа (например, в последнее время я часто использую пустой NullDeleter). Можно ли как-то без противоречий согласовать это поведение, и предлагаемый тобой вариант, что по-умолчанию должен вызываться delete для указателя на базовый класс?
Глаза у меня добрые, но рубашка — смирительная!
Re[6]: Для многих неочевидно...
От: Erop Россия  
Дата: 14.09.12 14:14
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Знаешь, это как в анекдоте про лектора. Который говорит: «Это утверждение очевидно!», потом задумчиво смотрит на доску минут 40 и говорит: «Да, действительно очевидно.» Это к тому, что даже отлично зная все составляющие этой задачи по отдельности, в условиях собеседования придётся изрядно поскрипеть мозгами, прежде чем раскусить её в такой формулировке.


Ну тут я согласен и не согласен.
Согласен я с тем, что формулировка ТС была несколько сбивающая с толку. Так как UB и "статическианалитически определите, что произойдёт" для меня, лично, как бы антонимы...

поэтому не ясно, что у тебя спрашивают-то? То ли про то, что ты понимаешь, что такое UB, то ли про то, что ты понимаешь, как работает ?: то ли про shared_ptr, то ли просто глум какой.

Хотя я вот подумал тут и понял, что мой ответ мне гравится, но я так вспоминаю разных собеседователей, и боюсь, что он не понравился бы им, так как, фактически, я сказал, в корректной форме "дядя! вы задали очень глупый вопрос!"...
Соответственно я не знал бы что отвечать в условиях реального собеседования. Правду, полуправду, что-то переспросить и т. д...

Хотя, с третьей стороны, это такой хитрый тест выходит, ты, как бы, с одной стороны проверяешь способность кандидата мыслить логически и доводить рассуждения до конца, а с другой, ставишь его в условия, когда он должен указать на ошибку начальнику
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Для многих неочевидно...
От: Erop Россия  
Дата: 14.09.12 14:16
Оценка:
E>Хотя, с третьей стороны, это такой хитрый тест выходит, ты, как бы, с одной стороны проверяешь способность кандидата мыслить логически и доводить рассуждения до конца, а с другой, ставишь его в условия, когда он должен указать на ошибку начальнику

И, кстати, я бы, пожалуй, весьма зауважал контору, которая подобный многослойные вопросы задаёт осмысленно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: UB
От: Qbit86 Кипр
Дата: 14.09.12 14:19
Оценка:
Здравствуйте, Erop, Вы писали:

E>Согласен я с тем, что формулировка ТС была несколько сбивающая с толку. Так как UB и "статически аналитически определите, что произойдёт" для меня, лично, как бы антонимы... :xz:

E>поэтому не ясно, что у тебя спрашивают-то?

Я думаю, можно неявно свернуть (развернуть?) вопрос до: «что произойдёт или, если UB, что должно произойти для популярных реализаций C++, и почему».
Глаза у меня добрые, но рубашка — смирительная!
Re[7]: UB
От: Qbit86 Кипр
Дата: 14.09.12 14:33
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>То ли про то, что ты понимаешь, что такое UB, то ли про то, что ты понимаешь, как работает


Вопросы про UB можно задавать, и «что будет» тоже. Скажем, описать некое конкретное неопределённое поведение в каком-нибудь компиляторе и попросить объяснить, как такое могло получится. Например, набившее оскомину «++i + ++i». Хорошо, если собеседуемый знает, что есть sequence points. Ещё лучше, если знает, что их нет. И так далее.
Глаза у меня добрые, но рубашка — смирительная!
Re: boost троллинг
От: serg_joker Украина  
Дата: 14.09.12 15:43
Оценка: +2 -1
Снимите бомбочку, пожалуйста. Хороший вопрос же.
Re[2]: Бомбочка
От: Qbit86 Кипр
Дата: 14.09.12 15:45
Оценка: +1
Здравствуйте, serg_joker, Вы писали:

_>Снимите бомбочку, пожалуйста. Хороший вопрос же.


Нажми на бомбочку, выбери пункт «Оставить как есть».
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: Третий тип
От: Mazay Россия  
Дата: 14.09.12 15:50
Оценка: -1
Здравствуйте, Qbit86, Вы писали:

M>>Да, точно, только для демонстрации странности можно ещё выкинуть третий тип...


Q>А ты знаешь, нет! Третий тип добавляет примеру изящества.


Q>И только если взять слишком умный указатель (а тем более спрятать тип промежуточного наследника за тернарным оператором), получаем вдруг «~b» — что-то среднее. Красивый результат.


Ну конечно, и народ конечно начал обсуждать и результирующий тип тернарного оператора, и невиртуальность деструкторов (видимо в зависимости от того, какие грабли в своё время оставили наиболее яркие воспоминания, ). Тогда уж надо было вывалить кусок реального кода и попросить найти в нём спрятанную фишку.
Здесь же главное обратить внимание на то, что конструктор shared_ptr заводит отдельный параметр-тип для своего аргумента, а не использует тип класса. То есть не так, как можно было бы предположить:
template <typename T>
shared_ptr<T>::shared_ptr(T *x) { ... }

а вот так:
template <typename T> template <typename Y>
shared_ptr<T>::shared_ptr(Y *x) { ... }

Здесь тип T определяет то, как будет видится указатель при жизни (разыменование, присваивание и т.д.), а тип Y — то, как будет удаляться объект. Концептуально это интересно тем, что "визуально" мы видим у shared_ptr один параметр-тип (T), а фактически поведение параметризуется двумя типами (T и Y).
Главное гармония ...
Re[2]: boost троллинг
От: Vain Россия google.ru
Дата: 14.09.12 15:59
Оценка:
Здравствуйте, dilmah, Вы писали:

D>осталось узнать при чем тут буст

Ну так вопрос на засыпку!
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: boost троллинг
От: 0x7be СССР  
Дата: 14.09.12 16:04
Оценка:
Здравствуйте, ezdoctor, Вы писали:

E>Что произойдет (желательно решать аналитически)?

E>class a {
E>...
E>}
Так вот зачем на собеседовании спрашивать про виртуальный деструктор
Re[6]: Третий тип
От: Piko  
Дата: 14.09.12 16:22
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Ну конечно, и народ конечно начал обсуждать и результирующий тип тернарного оператора, и невиртуальность деструкторов (видимо в зависимости от того, какие грабли в своё время оставили наиболее яркие воспоминания, ). Тогда уж надо было вывалить кусок реального кода и попросить найти в нём спрятанную фишку.

M>Здесь же главное обратить внимание на то, что конструктор shared_ptr заводит отдельный параметр-тип для своего аргумента, а не использует тип класса.

почему это главное? тернарный оператор тут как бы не последнюю роль играет
так что сдувай щёчки
Re[7]: Третий тип
От: Mazay Россия  
Дата: 14.09.12 17:14
Оценка: -2
Здравствуйте, Piko, Вы писали:

M>>Ну конечно, и народ конечно начал обсуждать и результирующий тип тернарного оператора, и невиртуальность деструкторов (видимо в зависимости от того, какие грабли в своё время оставили наиболее яркие воспоминания, ). Тогда уж надо было вывалить кусок реального кода и попросить найти в нём спрятанную фишку.

M>>Здесь же главное обратить внимание на то, что конструктор shared_ptr заводит отдельный параметр-тип для своего аргумента, а не использует тип класса.

P>почему это главное? тернарный оператор тут как бы не последнюю роль играет

Какую роль? Вместо тернарного оператора можно было подставить любое выражение с типом, отличным от a*, лишь бы кастовалось к a*. Понятно, что тернарный оператор может вызвать WTF, но топик-то не об этом, а об особенностях shared_ptr.

P>так что сдувай щёчки

Перешёл на личности — значит слил.
Главное гармония ...
Re[8]: Третий тип
От: Piko  
Дата: 14.09.12 18:21
Оценка:
Здравствуйте, Mazay, Вы писали:

P>>почему это главное? тернарный оператор тут как бы не последнюю роль играет

M>Какую роль?

роль непосредственно влияющую на результат

M>Вместо тернарного оператора можно было подставить любое выражение с типом, отличным от a*, лишь бы кастовалось к a*. Понятно, что тернарный оператор может вызвать WTF, но топик-то не об этом, а об особенностях shared_ptr.


а какого хрена он об особенностях shared_ptr, если в первом же сообщении только написано

Что произойдет (желательно решать аналитически)?

?

P>>так что сдувай щёчки

M>Перешёл на личности — значит слил.

твоё "Ну конечно, и народ конечно начал обсуждать" — считается сливом?
Re[5]: Третий тип
От: PlusMyTwitterFace  
Дата: 14.09.12 18:27
Оценка:
Q>И только если взять слишком умный указатель (а тем более спрятать тип промежуточного наследника за тернарным оператором), получаем вдруг «~b» — что-то среднее. Красивый результат.

Я, кстати, так и не понял, почему в stdout попадает "~b~a", а не "~c~b~a". То, что это из-за тернарного оператора, я уже догадался, но почему именно так происходит?
Re[4]: Думаю, что со всех локальных дисков удалят boost?.. Не, не угадал?
От: PlusMyTwitterFace  
Дата: 14.09.12 18:30
Оценка:
E>Ну я бы вот очень хотел иметь фичу "чёрный списко", которая бы фильтровала бы таки сообщения от ряда лиц

Вы про меня?
Re[6]: Третий тип
От: Piko  
Дата: 14.09.12 18:34
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

PMT>Я, кстати, так и не понял, почему в stdout попадает "~b~a", а не "~c~b~a". То, что это из-за тернарного оператора, я уже догадался, но почему именно так происходит?


http://lmgtfy.com/?q=ternary+operator+return+type
Re[5]: Думаю, что со всех локальных дисков удалят boost?.. Не, не угадал?
От: Erop Россия  
Дата: 14.09.12 18:42
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

E>>Ну я бы вот очень хотел иметь фичу "чёрный списко", которая бы фильтровала бы таки сообщения от ряда лиц


PMT>Вы про меня?


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

Если вью линейная, то их просто не надо мне показывать, а если деревянное, то можно, например, показывать только те ветки, где есть ответы других лиц, или и подветки не показывать, или ещё как сделать...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Третий тип
От: PlusMyTwitterFace  
Дата: 14.09.12 18:44
Оценка: :)
Ок, второй и третий операнды тернарного оператора должны быть одного и того же типа, в связи с чем один из них должен быть преобразован к типу другого, но почему c конвертится к b, а не наоборот?
Re[6]: Думаю, что со всех локальных дисков удалят boost?.. Не, не угадал?
От: PlusMyTwitterFace  
Дата: 14.09.12 18:46
Оценка: :)
E>Я бы не хотел переходить на личности, чего-то кому-то доказывать, или показывать, а просто тихо мирно приватно игнорить сообщения от некоторых людей и всё.

Ок, очень жаль, что Вы так. Всё равно благодарю за многочисленные ответы мне.
Re[8]: Третий тип
От: PlusMyTwitterFace  
Дата: 14.09.12 18:54
Оценка:
Ну, я так понимаю, что это из-за того, что каст от базового к производному касту без лишних действий не выполнить, в отличие от обратной ситуации:

#include <iostream>

class Base
{
};

class Derived : public Base
{
};

int main()
{
   Base* first;
   Derived* second;
   
   Base* foo = second; // Ok
   Derived* bar = first; // Error: invalid conversion from 'Base*' to 'Derived*'
}
Re[9]: Третий тип
От: Piko  
Дата: 14.09.12 19:19
Оценка: +1
Здравствуйте, PlusMyTwitterFace, Вы писали:

PMT>Ну, я так понимаю, что это из-за того, что каст от базового к производному касту без лишних действий не выполнить,


я тебе, копатель стандарта, больше скажу, в части случаев легально это сделать вообще не получится, не то что лишнее действия
Re[7]: Думаю, что со всех локальных дисков удалят boost?.. Не, не угадал?
От: Erop Россия  
Дата: 14.09.12 20:21
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:
PMT>Ок, очень жаль, что Вы так. Всё равно благодарю за многочисленные ответы мне.

Почему ты решил, что я говорю о тебе?
вроде как ОТКРЫТЫМ текстом прямо сказал, что не хочу обсуждать персоналии, а хочу фичу
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Думаю, что со всех локальных дисков удалят boost?.. Не, не угадал?
От: PlusMyTwitterFace  
Дата: 15.09.12 13:39
Оценка: :)
E>UB произойдёт... так как ты удалишь экземпляр не имеющего виртуального деструктора класса С, через указатель на его базу B.

Почему UB? Вроде как по приведённым здесь цитатам было ясно, что всё должно идти так, как будто у данных классов были бы виртуальные деструкторы, разве нет?
Re[5]: Smart vs. raw
От: okman Беларусь https://searchinform.ru/
Дата: 15.09.12 15:05
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Возможно, топик-стартера смущает, что поведение умного указателя не совпадает с поведением сырого:

Q>...

Тогда это не совсем правильный умный указатель.
Re[6]: Неопределённое поведение
От: Qbit86 Кипр
Дата: 15.09.12 15:19
Оценка:
Здравствуйте, okman, Вы писали:

Q>>Возможно, топик-стартера смущает, что поведение умного указателя не совпадает с поведением сырого:

O>Тогда это не совсем правильный умный указатель.

По твоему, разработчики правильных указателей должны оставаться верны не только семантике сырых указателей, но и их неопределённому поведению?
Глаза у меня добрые, но рубашка — смирительная!
Re[7]: Неопределённое поведение
От: okman Беларусь https://searchinform.ru/
Дата: 15.09.12 15:59
Оценка: -2 :)
Здравствуйте, Qbit86, Вы писали:

Q>По твоему, разработчики правильных указателей должны оставаться верны не только семантике сырых указателей, но и их неопределённому поведению?


Да.
Потому что так обеспечивается единообразие.
И тогда у человека, который, скажем, портирует на C плюсовый код, нашпигованный умными указателями,
никогда не возникнет вопросов об отсутствии виртуального деструктора и о том, почему shared_ptr
удаляет класс по-другому, чем сырой указатель или scoped_ptr.
Re[8]: Неопределённое поведение
От: ezdoctor  
Дата: 15.09.12 16:36
Оценка:
Здравствуйте, okman, Вы писали:

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


Q>>По твоему, разработчики правильных указателей должны оставаться верны не только семантике сырых указателей, но и их неопределённому поведению?


O>Да.

O>Потому что так обеспечивается единообразие.
O>И тогда у человека, который, скажем, портирует на C плюсовый код, нашпигованный умными указателями,
O>никогда не возникнет вопросов об отсутствии виртуального деструктора и о том, почему shared_ptr
O>удаляет класс по-другому, чем сырой указатель или scoped_ptr.

Есть парадигма программирования, что код должен иметь ожидаемое поведение.
В данном случае если пользоваться shared_ptr не зная о таком подвохе, то ничего страшного не случится: написанный код будет работать ожидаемо. Скорее наоборот: если тот, кто не знает о фактическом стандарте на shared_ptr увидит код с использованием этого наворота, то вначале посчитает дураком того, кто такой код написал (и будет не прав), а потом, возможно, прочитает умную книжку. Ну или перестрахуется (например, сделает деструктор виртуальным).

А что меня смущает, так это диссонанс между тем, как всем нравятся модный ныне shared_ptr и тем, что фактически большинство с умным видом использующих его программистов не знают его реализации, и даже не могут поверить, что такое поведение возможно реализовать. Насчет "большинства" --- в моем окружении не знал никто, включая техническое начальство.
Re[9]: Неопределённое поведение
От: Кодт Россия  
Дата: 17.09.12 20:03
Оценка:
Здравствуйте, ezdoctor, Вы писали:

E>Есть парадигма программирования, что код должен иметь ожидаемое поведение.


Это не парадигма, а здравый смысл, безотносительно парадигмы
Фокус в том, что "ожидаемое" означает сразу две вещи: неиспользование хаков (исключаем фактор непредсказуемости со стороны платформы) и соответствие с компетенцией читателя (а тем более, писателя) кода.

Если в коллективе есть люди, плохо понимающие shared_ptr, то нужно либо не использовать его вовсе, чтобы не смущать их нежный глаз, или проводить курсы повышения квалификации. Первая мера — техническая, вторая — организационная. В качестве организационно-технической меры на переходный период (либо в особенно тонких местах) нужно использовать комментарии.
shared_ptr<WithoutVirtualDtor> foo(); // возвращает ПОЛИМОРФНЫЕ данные, заботится о корректном вызове деструктора
shared_ptr<SomethingElse> from_dll(); // возвращает данные ЧЕРЕЗ ГРАНИЦУ МОДУЛЯ, заботится о корректном вызове менеджера кучи
shared_ptr<EvenMore> smart_handle();  // это вообще ХЭНДЛ, со своим специальным удалятелем
Перекуём баги на фичи!
Re[5]: Насколько оправдан стандарт shared_ptr
От: slava_phirsov Россия  
Дата: 18.09.12 09:09
Оценка:
Здравствуйте, ezdoctor, Вы писали:

E>Речь о том, что (как выяснилось) мало кто знает о том, как в реальности shared_ptr хранит внутри указатель. Даже те, кто просит на собеседовании написать его реализацию.


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


Возможно, те, кто просят написать реализацию, имеют в виду не std::shared_ptr, а какой-то свой/почерпнутый из литературы велосипед, который данной багофичей не обладает? Если так, то отнюдь не странно, что человек не знает особенностей того, чем он, возможно, даже не пользовался. Если человек пользуется std::shared_ptr, но не удосужился почитать соответствующие доки, то это уже гораздо хуже. Навскидку приходит в голову аналогичный пример — T& QList::operator[](int) , про который и по сию пору приходится слышать, что он имеет сложность O(N). Ну, типа, список же.

P.S. Благодаря ТС мы теперь знаем, что будет модно спрашивать на собеседованиях в новом сезоне.
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.