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

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

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

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

42 ответов

7 просмотров

что таоке 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
По семантике я бы это ко всем умным указателям отн...

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

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

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

комрады, че-та лыжы не едут var tmpFont: TFont; begin tmpFont:= TFont.Create; try case rgFontColor.ItemIndex of 0: tmpFont.Color:= clWindowText; 1: tmpFo...
Ed Doc
34
Интересно, нет ли какого-то способа получить из dll не адрес самой метки, а адрес со смещением?
The Bird of Hermes
54
Можно вообще написать: Person fName' lName' age'. Тогда действительно имена полей потребуются лишь в строковом виде, чтобы эти fName' и т.д. достать :-) Но разве для этого нуж...
Михаил
8
generic procedure function test<T>(param: T); type case T of longint: NewT = word; longword: NewT = byte; end; var v1: NewT; Как это можно сделать? Чтобы у меня...
notme
21
Делал задачу вот такую https://stepik.org/lesson/4985/step/9?unit=1083 получилось такое https://play.haskell.org/saved/ipKrepqe оно работает, тестов много не писал, но работае...
Fedor
22
Скажите, можно ли как-то "переместить" динамический массив из одной переменной в другую? Скажем, переместить из TList<> в TArray<>. Именно переместить, а не скопировать. Если ...
Eugene Krasnikov (ᴊɪɴ x)
35
преобразовать в число или в один тип?
Alexey Kulakov
11
Hello everyone I am trying to run 4 year old project and I am having this issue anyone can help?
Nitish Garg
11
Всем привет, прошу совета по сложившейся ситуации: Windows приложение подключается к БД MySQL используя Firedac. При работе с версией MySQL 5.7 все отлично, но когда подключаю...
Constantine
6
Всем добрый вечер. Нужна помощь с прикруткой telegram-vapor-bot к проекту Vapor. Удалось после старта приложения отправить тестовое сообщение в бот, вот только сразу после это...
advanc3d
3
Карта сайта