170 похожих чатов

Каким образом можно из shared переменной сделать unique? Пример для людей,

которые любят спрашивать "а зашем":
Допустим, я создал и использовал в нескольких местах переменную в качестве shared, но потом я решил, например, сохранить ее в массиве, где, тоже например, хранятся другие уникальные значения данного типа, которые не предполагается использовать больше нигде, кроме как не через сам массив.

Ну и насколько это вообще оправдано? Кастить общую к уникальной?

42 ответов

22 просмотра

что таоке shared переменная

только копированием разадресованного объекта в новый и помещение в unique_ptr

Well Done- Автор вопроса
Well Done- Автор вопроса
Anatoly Shirokov
только копированием разадресованного объекта в нов...

То есть мне ФИЗИЧЕСКИ придется сделать его полную копию и использовать ее уже на свое усмотрение, а старую reset-нуть?

положи не сам объект в поинтер, а специальную обертку над ссылкой на этот объект, которая когда тебе надо bool=false и не удаляет

Well Done
То есть мне ФИЗИЧЕСКИ придется сделать его полную ...

Прямого преобразования из shared_ptr в unique_ptr нет

Well Done
Фу, ужас

а то что ты собрался делать прям крутая вещь...

Well Done- Автор вопроса
Well Done- Автор вопроса
Kelbon
а то что ты собрался делать прям крутая вещь...

Ограничить использование ресурса? А в чем проблема?

Well Done
Ограничить использование ресурса? А в чем проблема...

я предложил нормальное решение, обертка

Well Done
То есть мне ФИЗИЧЕСКИ придется сделать его полную ...

Переместите, это разумнее, эффективнее и лучше отражает семантику кода (перемещаем значения из шаренной области в уникальную, а не магически превращаем одно в другое)

Well Done- Автор вопроса
Ofee Oficsu
Переместите, это разумнее, эффективнее и лучше отр...

Не понял, то есть вы предлагаете мне сразу использовать unique? А если придет (из библиотеки, например) shared, то что делать? Как быть с функциями, которые используют данное значение (принимают shared)?

Well Done
Не понял, то есть вы предлагаете мне сразу использ...

Подумать, нужен ли unique_ptr вообще, раз библиотека возвращает shared_ptr

Well Done- Автор вопроса
Well Done
Не понял, то есть вы предлагаете мне сразу использ...

Я предлагаю что-то вроде: auto shared = make_shared<Foo>(/* ... */); // ... auto unique = make_unique<Foo>(std::move(*shared)); Ещё лучше, конечно же, с самого начала оперировать уникальным указателем, ведь его всегда можно преобразовать в shared

Well Done- Автор вопроса
Dmitriy [Отпуск]
Объясните, зачем?)

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

Dmitriy [Отпуск]
Объясните, зачем?)

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

Well Done- Автор вопроса
Ofee Oficsu
Я предлагаю что-то вроде: auto shared = make_shar...

Разочаровывает, что, насколько я понимаю, shared будет ссылаться на те же самые данные. Жаль, что нет метода leave или около того

Ofee Oficsu
Их семантика различна. Уникальный указатель сильне...

Кажется, вопрос был не о разнице между unique и shared...

Well Done- Автор вопроса
Dmitriy [Отпуск]
Кажется, вопрос был не о разнице между unique и sh...

О контроле в том числе. Shared принадлежит нескольким (ну, логично), а unique можно контролировать в одном конкретном месте (потоке исполнения, если угодно)

Dmitriy [Отпуск]
Кажется, вопрос был не о разнице между unique и sh...

Ответ на "зачем" – чтобы лучше выразить эту самую семантику в своём коде

Ofee Oficsu
Ответ на "зачем" – чтобы лучше выразить эту самую ...

Согласен, но раз библиотека использует shared в том числе во вспомогательных функциях - нецелесообразно изобретать трудности для самого себя

Well Done- Автор вопроса
Dmitriy [Отпуск]
Согласен, но раз библиотека использует shared в то...

Я уже предложил оставить данный вопрос: так всем будет проще. Мне просто интересно, где бы это могло пригодится. А не использовать это всегда успеем

Well Done
Разочаровывает, что, насколько я понимаю, shared б...

Честно говоря, я не вполне понял смысл первого предложения, так что мне трудно прокомментировать его

Well Done- Автор вопроса
Ofee Oficsu
Честно говоря, я не вполне понял смысл первого пре...

Насколько я понимаю, данное предположение auto shared = make_shared<Foo>(/* ... */); // ... auto unique = make_unique<Foo>(std::move(*shared)); Никак не касается блока, на который ссылается САМ shared для контроля. То есть, мы все также сможем использовать shared (совместно с unique), что может повлечь лишние проблемы. Ну, это если я все правильно понял и код можно исполнить (в том или ином виде, но с тем же смыслом)

Dmitriy [Отпуск]
Согласен, но раз библиотека использует shared в то...

Я бы сделал попытку донести до авторов библиотеки, что предоставлять пользователю unique_ptr обычно предпочтительнее, ведь иногда мы способны повлиять на используемую библиотеку

Well Done- Автор вопроса
Ofee Oficsu
Я бы сделал попытку донести до авторов библиотеки,...

Ну, в мире github можно использовать issue, насколько я помню. А там уже предложить изменения, но это ванильный вариант

Well Done
Насколько я понимаю, данное предположение auto sh...

Все shared будут теперь указывать на некоторый пустой объект, не связанный с unique Но ведь это и не страшно, поскольку данный shared должен быть последним, если мы хотим поддержать семантику, конвертировав его в unique и он вместе с пустым объектом умрёт в текущем скоупе. Если же он был не последним – вы где-то запутались в собственных рассуждениях и преобразование shared_ptr в unique_ptr – не то, что вы на самом деле хотите

Ofee Oficsu
Все shared будут теперь указывать на некоторый пус...

Ну, и стоит заметить, что вопросы, связанные с deleter я опустил в данном примере

Well Done- Автор вопроса
Ofee Oficsu
Все shared будут теперь указывать на некоторый пус...

Я не знаю, как компилятор разрешает подобные ситуации. ``` Если же он был не последним – вы где-то запутались в собственных рассуждениях и преобразование shared_ptr в unique_ptr – не то, что вы на самом деле хотите ``` Я могу запутаться и без этого 'если'

Well Done- Автор вопроса
Ofee Oficsu
Ну, и стоит заметить, что вопросы, связанные с del...

Про это я пока не слышал (мне уже написали, постараюсь покапать по данной теме)

Well Done
Я не знаю, как компилятор разрешает подобные ситуа...

Я думаю, что стоит немного поэкспериментировать на простых примерах и после этого только рассматривать свой, более сложный реальный случай

Well Done- Автор вопроса
Ofee Oficsu
Я думаю, что стоит немного поэкспериментировать на...

Где-то чуть раньше я писал, что это чисто теоретические рассуждения. Я хочу узнать, стоит ли позволять приводить тип shared к unique В данный момент я изучаю контроль памяти, для меня это впервые и тема достаточно интересная На stackoverflow есть интересный, но нечеткий вопрос: можно ли заменить ВСЕ указатели в коде на умные? То есть, вообще все, а те, что приходят извне - оборачивать в умные

Well Done- Автор вопроса
Kirill Bolshakov
Можно, но не нужно

Потому что unique используется в основном в скоупах или для полного владения над объектом? Я просто сам хочу ответить себе на этот вопрос

Well Done
Потому что unique используется в основном в скоупа...

Потому что шаред имеет оверхед, как по производительности, так и по семантике

Well Done- Автор вопроса
Kirill Bolshakov
Потому что шаред имеет оверхед, как по производите...

По семантике я бы это ко всем умным указателям отнес

Well Done
По семантике я бы это ко всем умным указателям отн...

Указатель, ведущий себя как невладеющая ссылка, которую можно ребиндить

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Ребят в СИ можно реализовать ООП?
Николай
33
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта