1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
|
Умные указатели. У кого есть опыт использования?07.07.2019, 18:14. Показов 5494. Ответов 68
Метки нет Все метки)
(
Пытаюсь понять пользу ”Умных указателей”
std::unique_ptr , std::shared_ptr, std::weak_ptr, std::scoped_ptr Принцип их работы кое как уяснил. Смущает, что технология остается “рискованной” и требует дополнительных знаний внутренностей. На фоне всех этих сложностей, какова польза “умных” указателей? Интересует не теория, а именно опыт применения.
0
|
07.07.2019, 18:14 | |
Ответы с готовыми решениями:
68
У кого есть опыт использования C++ Builder XE2, поделитесь впечатлениями (отзывы) - FireMonkey Стук на продажные ссылки - у кого есть опыт? Есть ли у кого опыт по написанию демона по linux |
19423 / 10040 / 2446
Регистрация: 30.01.2014
Сообщений: 17,701
|
|
07.07.2019, 18:19 | |
В чем эта рискованность проявляется по-вашему?
![]() Применяю (не обязательно перечисленные вами, но и другие варианты, в зависимости от ситуации) в 100% своих проектов на протяжении 18 лет.
1
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
07.07.2019, 18:50 | |
польза в том что бы не беспокоиться о delete
надо просто понять какой указатель как работает что бы знать когда этот смарт поинтер перестает владеть ресурсами а знать внутренности полезно но не обязательно в основном это нужно что бы понимать сколько именно придется заплатить за удобство
1
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
|
07.07.2019, 19:03 [ТС] | |
Это немного странно,
пару книг по C++ я прочитал, там навязывают мнение, что, наоборот: "о вызове delete надо беспокоситься." и это обязанность программиста. Пожалуйста, объясните: зачем, при динамическом выделении памяти, программиста отучать от delete?
0
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
|
07.07.2019, 19:09 [ТС] | |
Как раз хочу понять "пользу" умных указателей, чтоб сравнить с "негативной" стороной(а может ее нет)
P.S. В чем риск?! Предположим, программист не знает внутренностей "умных" указателей, и он захочет использовать адресную арифметику, т.к. для простых указателей это нормально.
0
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
07.07.2019, 19:11 | |
я бы внес поправку: это обязанность программиста, который не использует смарт поинтер
![]() хотя в некоторых случаях даже используя смарт поинтер надо беспокоиться о delete (это нестандартные ситуации, где применяется пользовательская функция для освобождения ресурсов). ну не то что бы отучать. просто вам как бы предлагается более удобный и безопасный вариант в виде смарт поинтера
1
|
19423 / 10040 / 2446
Регистрация: 30.01.2014
Сообщений: 17,701
|
|
07.07.2019, 19:15 | |
Естественно ни о каком "отучении" речь не идет.
Умные указатели нужны для того, чтобы автоматизировать контроль за временем жизни ресурса (динамического объекта, как частный случай). Чтобы код была написан так, что забота о корректном освобождении ресурса ложилась на компилятор (посредством вызова деструктора). Умные указатели - это выражение центральной идиомы С++ - RAII. Внутренности не надо знать. Нужно знать контракты. Т.е. какое поведение обеспечивает тот и иной инструмент.
3
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
|
08.07.2019, 11:10 [ТС] | |
Вот, это то, что внесет ясность.
Пожалуйста, разъясните. Придерживаясь идиомы RAII, существует два надежных варианта: 1) использовать Автоматические переменные (простые и понятные) 2) использовать “Умные” указатели (сложные и запутанные) Вопрос: в каких бытовых случаях “Умные” указатели лучше Автоматических переменных? Интересует не теория(я ее прочитал), а именно бытовая практика. Спасибо.
0
|
19423 / 10040 / 2446
Регистрация: 30.01.2014
Сообщений: 17,701
|
|
08.07.2019, 11:13 | |
Простите, что сразу не отвечаю на вопрос, но мне интересно, на каком основании вы провели такое разделение?
Умные указатели - это точно такие же автоматические переменные, как и остальные.
1
|
![]() 2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
08.07.2019, 11:20 | |
Могут быть весьма полезны для управления пассивными буферами/хранилищами данных. В некоторых простых случаях и для управления активными сущностями. Т.е. полная эмуляция GC только более эффективная и с корректной работой слабых ссылок и управлением ресурсами в отличие от оригинала. Предназначены в первую очередь для облегчения перехода на плюсы первокурсникам, коим в америках в школах поголовно моск насилуют явой . Как в общем то и вся stl.
Для чего то более серьезного типа обеспечения автоматики взаимосвязей активных объектов малопригодны. Хотя если с бубном поплясать то кое как работать будет но неудобно и неэффективно. Для этого лучше делать свои специализированные смарты под реалии задачи (как собственно автоматика и задумана в исходе). Ну а вообще как и вся stl - весьма многого для чего годные за счет того что мало для чего лучшие.
1
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
|
08.07.2019, 11:21 [ТС] | |
Извините, если что не так.
Вопросы могут казаться странными или чуть-чуть ”провокационными” , это только для того, чтоб докопаться до истины. Другой цели нет. Еще раз извините, за подобный стиль вопросов.
0
|
19423 / 10040 / 2446
Регистрация: 30.01.2014
Сообщений: 17,701
|
|||||||||||||||||||||
08.07.2019, 11:27 | |||||||||||||||||||||
Ну так на вопрос-то вы ответите?
![]() В чем смысл такого разделения? Вот вам пока два примера на подумать (примеры слегка искуственные, но не сказать, что совсем не реалистичные): Без умных указателей (сможете сами найти проблемное место?): Кликните здесь для просмотра всего текста
С умными указателями: Кликните здесь для просмотра всего текста
....................... Еще один без умных указателей: Кликните здесь для просмотра всего текста
С умными указателями: Кликните здесь для просмотра всего текста
2
|
![]() |
|
08.07.2019, 11:33 | |
1
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
|
08.07.2019, 11:36 [ТС] | |
Все просто. У человека, который впервые открыл учебник по C++ две недели назад, знания языка формируются обрывками.
И вот этими обрывками пытаюсь сложить картину, поэтому так странно выглядит. Т.е. к моим вопросам надо проще относиться ![]()
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
08.07.2019, 11:39 | |
Истина в том, что всегда, за редкими исключениями, нужно использовать умные указатели.
Единственный вопрос, который здесь должен возникать, это когда использовать unique_ptr, а когда shared_ptr/weak_ptr.
0
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
||||||
08.07.2019, 11:44 [ТС] | ||||||
спасибо за примеры, чуть позже я их буду разбирать подробнее. А сейчас лишь хотел пояснить, что мой вопрос о сравнении “умных” указателей с автоматическими переменными (а не с обычными указателями).
0
|
19423 / 10040 / 2446
Регистрация: 30.01.2014
Сообщений: 17,701
|
|
08.07.2019, 11:52 | |
Этот вопрос некорректен в своей постановке.
На это я и пытаюсь вам намекать. А вы про какое-то сложное отношение к вашим вопросам говорите ![]() Добавлено через 6 минут Интересно, а вы в курсе, что smart pointers как концепция, старше Java как минимум лет на 5? ![]() Например, вот статья из C Users Journal от 1992 года: https://collaboration.cmc.ec.g... wagner.htm
4
|
08.07.2019, 11:52 | ||||||
Помогаю со студенческими работами здесь
20
У кого есть опыт неудачной прошивки видеокарт? У кого есть опыт портирования прошивки cyanogenmod ? У кого есть опыт работы с gsm.dll? У кого есть опыт работы с шилдом на основе TB6612FNG paypal, есть у кого нибудь опыт работы с ipn ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
Новые блоги и статьи
![]() |
||||
Рекурсивные типы в Python
py-thonny 07.04.2025
Рекурсивные типы - это типы данных, которые определяются через самих себя или в сочетании с другими типами, которые в свою очередь ссылаются на исходный тип. В мире программирования такие структуры. . .
|
C++26: Объединение и конкатенация последовательностей и диапазонов в std::ranges
NullReferenced 07.04.2025
Работа с последовательностями данных – одна из фундаментальных задач, с которой сталкивается каждый разработчик. C++ прошел длинный путь в эволюции средств для манипуляции коллекциями – от. . .
|
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
|
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
|
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
|
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
|
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
|
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
|
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
|
Реляционная модель и правила Кодда: фундамент современных баз данных
Codd 05.04.2025
Конец 1960-х — начало 1970-х годов был периодом глубоких трансформаций в области хранения и обработки данных. На фоне растущих потребностей бизнеса и правительственных структур существовавшие на тот. . .
|