Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144

Умные указатели. У кого есть опыт использования?

07.07.2019, 18:14. Показов 7587. Ответов 68
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь понять пользу ”Умных указателей”
std::unique_ptr , std::shared_ptr, std::weak_ptr, std::scoped_ptr

Принцип их работы кое как уяснил. Смущает, что технология остается “рискованной” и требует дополнительных знаний внутренностей.
На фоне всех этих сложностей, какова польза “умных” указателей?

Интересует не теория, а именно опыт применения.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.07.2019, 18:14
Ответы с готовыми решениями:

У кого есть опыт использования C++ Builder XE2, поделитесь впечатлениями (отзывы) - FireMonkey
Кто юзал этого зверя? Меня он подкупил своим красивым дизайном... но что то они его криво сделали, багов много пытался сделать но...

Стук на продажные ссылки - у кого есть опыт?
Кто-нибудь стучал в гугл на сайт с продажными ссылками? (В панели вебмастера есть форма специальная.) Как быстро расправляется гугла...

Есть ли у кого опыт по написанию демона по linux
Есть ли у кого опыт по написанию демона? Моя задача в том что бы написать демона(deamon), или консольное background приложение под...

68
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.07.2019, 11:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Artem_Pv Посмотреть сообщение
А сейчас лишь хотел пояснить, что мой вопрос о сравнении “умных” указателей с автоматическими переменными (а не с обычными указателями).
Ну умные указатели это просто тип автоматических переменных. Т.е. все переменные которые живут на стеке/статическим полем класса/структуры имеют автоматическое управление временем жизни. А оное автоматическое управление означает что в конце жизненного цикла (выход из скопа, уничтожение содержащего объекта и т.д.) для экземпляров структур/классов автоматически вызывается деструктор. Что в свою очередь позволяет реализовать любые алгоритмы мгновееной реакции на потерю ссылки и как результат управления жизненным циклом ресурсов. А ручное управление памятью при этом позволяет рассматривать объекты на куче как вид ресурсов. Т.е. другими словами автоматическое управление временем жизни объектов + ручное управление памятью = полностью кастомизируемая автоматика всего и вся.
1
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
08.07.2019, 11:56
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Да вот именно так и есть.
А можно пример как при выходе умного указателя из скопа обнуляются все сырые ссылки на ресурс, которым он владел?
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.07.2019, 12:37
Цитата Сообщение от Kastaneda Посмотреть сообщение
А можно пример как при выходе умного указателя из скопа обнуляются все сырые ссылки на ресурс, которым он владел?
Запросто. Сырых указателей на такие ресурсы вообще нет. Религия не позволяет. Либо сырые либо смарты. Одно из двух. Это то что касается изкоробочных. Концепция владения у них та же что и у GC - пока ссылки есть не удалится и само/принудительное удвление не поддерживается.
А с обнулением/вычисткой из контейнеров при принудительном удалении - ну это уже к кастомным двунаправленным смартам. Но там сырые религия тем более не позволяет.

Добавлено через 16 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Интересно, а вы в курсе, что smart pointers как концепция, старше Java как минимум лет на 5?
Концепция да. И не на 5 а как минимум на 10 а то и 15. Почему GC нужно заменять именно автоматическим управлением временем жизни Страуструпу было известно прекрасно в самом начале разработки. Опыт с GC-ной симулой-67 у него был огромный (докторскую софтину он на ней писал), а соответсвенно и абсолютную бесполезность GC в деле ООП и управлении ресурсами он понимал прекрасно. Точно так же как и то как это делается вручную. Причем абсолютно одинаково что при наличии GC что без него. И именно это он и автоматизировал а кастомизацию автоматики возложил на смарты. Именно поэтому ява и все что на ней основано - полнейшая бессмыслица и анахронизм.
Но только не надо путать саму концепцию с искоробочными смартами stl, которые есть всего лишь одной из возможных реализаций концепции. При этом stl-реализация для ООП годится не очень - то же отсутсвие поддержки принудительного удаления и та же перевернутая по сравнению с композицией концепция владения что и у GC. И появились смарты по подобной схеме в stl именно после того как те кому моск изнасиловали явой начали попадать на первый курс. А до этого они нафиг никому не нужны были. Потому что концепция подразумевает их абсолютную кастомизируемость под задачу.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.07.2019, 12:46
Artem_Pv,
вот вам еще пример
C++
1
2
3
4
5
6
void f()
{
    std::unique_ptr<int> p (new int);
    function_which_can_throw_exception();
    //...
}
покажите как будете освобождать память если не использовать смарт поинтер
сразу скажу что ловить исключение в f нельзя

Добавлено через 1 минуту
Цитата Сообщение от Undisputed Посмотреть сообщение
сразу скажу что ловить исключение в f нельзя
всмысле технически можно
но по задаче это нам не подходит
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
08.07.2019, 12:51
Цитата Сообщение от Undisputed Посмотреть сообщение
всмысле технически можно
но по задаче это нам не подходит
Какая-то глупая задача - ресурс в случае исключения освободить надо, но исключения ловить нельзя.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.07.2019, 12:54
Цитата Сообщение от Croessmah Посмотреть сообщение
Какая-то глупая задача - ресурс освободить надо, но исключения ловить нельзя.
почему же глупая
просто я задал ему вопрос что бы он подумал
и пришел к тому что тут реальная выгода от использования смарт поинтера
т.е я не призывал делать так на практике
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
08.07.2019, 12:58
Undisputed, ну потому что задача сводится не к пользе умных указателей.
В общем задача звучит так - вот какой хороший умный указатель, повтори без него, но при этом запрещено использовать другие средства.
1
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
08.07.2019, 12:58
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Но только не надо путать саму концепцию с искоробочными смартами stl, которые есть всего лишь одной из возможных реализаций концепции.
Эти "смарты" целиком пришли из boost. Поэтому их совокупное время существования (со второй половины 1998 года) ну никак не вяжется с вашим заявлением про обучение Java-студентов Java на тот период еще пешком под стол ходил.
При этом реализация, которая представлена в boost, использует (естественно с доработками) предложенную реализацию в 1994 Грегом Колвином.
Цитата Сообщение от https://www.boost.org/doc/libs/1_31_0/libs/smart_ptr/smart_ptr.htm
Summer, 1994. Greg Colvin proposed to the C++ Standards Committee classes named auto_ptr and counted_ptr which were very similar to what we now call scoped_ptr and shared_ptr.
Вот ссылка на оригинальный документ: http://www.open-std.org/jtc1/s... /N0555.pdf

Поэтому я просто прошу вас давать факты, а не домыслы.
2
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
08.07.2019, 12:59
del
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
08.07.2019, 13:02
Artem_Pv, о умных указателях (ведущих, порождающих, владеющих и т.д.) можете почитать в книге Джеффа Элджера - "C++: Библиотека программиста".
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.07.2019, 13:04
Цитата Сообщение от Croessmah Посмотреть сообщение
ну потому что задача сводится не к пользе умных указателей.
еще как сводится
если бы он взялся то за решение то он мог бы например прислать что-то такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void function_which_can_throw_exception(){}
 
void f(int *& result)
{
    result = new int;
    function_which_can_throw_exception();
    // ...
}
 
int main()
{
    int* result;
    f(result);
    delete result;
}
и понял бы что со смарт поинтером было бы удобнее управлять ресурсами в подобных случаях
чем не еще один use case?
Цитата Сообщение от Croessmah Посмотреть сообщение
Вообще, странно, что никто еще не упомянул о идиоме RAII, это же основа умных указателей.
DrOffset упомянул...
и пример с эксепшеном у него тоже был
просто я преподнес ТС это в виде задачи
что бы он поразмыслил сам а не зубрил все что ему напишут
помоему так лучше понять и запомнить материал
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.07.2019, 13:06
Цитата Сообщение от DrOffset Посмотреть сообщение
Эти "смарты" целиком пришли из boost. Поэтому их совокупное время существования (со второй половины 1998 года) ну никак не вяжется с вашим заявлением про обучение Java-студентов Java на тот период еще пешком под стол ходил.
Американские школы полностью перевели на жабу с 2000-го. А что там лежит в буст - ее проблемы. Схема для своих задач полностью рабочая, особенно для пассивных буферов данных. ООП-яыки с GC были и до жабы. Если кому то понадобился эмулятор GC - ну это слепить как два пальца об асфальт. Только в стандартной библиотеке он не нужен был нафиг пока он не понадобился всем первокусникам на время перехода.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
08.07.2019, 13:08
Цитата Сообщение от Undisputed Посмотреть сообщение
DrOffset упомянул...
Я уже увидел, потому удалил.
Цитата Сообщение от Undisputed Посмотреть сообщение
если бы он взялся то за решение то он мог бы например прислать что-то такое
Ну да, ведь другой нормальный путь решения запрещен.
C++
1
2
3
4
5
6
7
8
9
void f()
{
    int * p = new int;//Без try
    try { //Весь остальной код под защитой
        function_which_can_throw_exception();
    } catch (...) {
        delete p;
    }
}

Не по теме:

К слову, если код не ловит исключений, и оно вылетит из main, то деструкторы могут и не вызваться.

1
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.07.2019, 13:09
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот ссылка на оригинальный документ: http://www.open-std.org/jtc1/s... /N0555.pdf
Поэтому я просто прошу вас давать факты, а не домыслы.
Ну вот потому их сразу в стандартную библиотеку и не внесли потому что нафиг не нужны были. Они если и нужны вообще то только для вспомогательных задач. Сам Страуструп был удивлен насколько этот обрубок концепции широкое применение получил.
1
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
08.07.2019, 13:10
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Только в стандартной библиотеке он не нужен был нафиг пока он не понадобился всем первокусникам на время перехода.
В каком году студентам резко понадобились смартпойнтеры в стандарте C++?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.07.2019, 13:11
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну да, ведь другой нормальный путь решения запрещен.
запрещен не из за того что это нормальный путь
может же быть случай когда нам надо поймать этот эксепшен за пределами этой функции
скажем если функция бросает разные исключения в трех разных кейсах которые происходят в функции
и в зависимости от исключения на вызывающей стороны мы должны принять разные меры

P.S в своем примере в мейне забыл обернуть вызов функции в трай кетч
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.07.2019, 13:12
Цитата Сообщение от DrOffset Посмотреть сообщение
В каком году студентам резко понадобились смартпойнтеры в стандарте C++?
2000-ый перевод школ на жабу. Значит район 2003-го поголовно.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.07.2019, 13:21
Croessmah,
и еще твой код отсюда
Умные указатели. У кого есть опыт использования?
будет с утечкой памяти
если не будет исключения
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.07.2019, 13:23
DrOffset, мало того есть еще один аспект который мог очень значительно повлиять в пользу решения о внесении их в стандартуню библиотеку. А именно многоядерные процы. В мультипоточной среде счетчики ссылок у shared_ptr и weak_ptr должны быть атомарными. А атомарный счетчик - штука платформозависимая. Ну а первейшая задача стандартной библиотеки - сокрытие деталей аппаратной реализации.
1
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
08.07.2019, 13:25
Цитата Сообщение от Undisputed Посмотреть сообщение
если не будет исключения
угу. В этом его соль.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.07.2019, 13:25

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

У кого есть опыт портирования прошивки cyanogenmod ?
Здравствуйте.У кого нибудь есть опыт портирования cyanogenmod ? Решил портировать прошивку под свой девайс, DNS AirTab mp7851 , но...

У кого есть опыт работы с gsm.dll?
Здравствуйте, есть dll gsm.dll - функционал шикарный Библиотека и набор программ для доступа к мобильному телефону через GSM модем....

У кого есть опыт работы с шилдом на основе TB6612FNG
Купил вот такую версию драйвера. Движок крутится туда - сюда. Но не реагирует на шим. И не работает standby. У продавца в описание...

paypal, есть у кого нибудь опыт работы с ipn ?
есть у кого нибудь опыт работы с ipn ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru