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

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

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

Author24 — интернет-сервис помощи студентам
Пытаюсь понять пользу ”Умных указателей”
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
19423 / 10040 / 2446
Регистрация: 30.01.2014
Сообщений: 17,701
07.07.2019, 18:19
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Смущает, что технология остается “рискованной” и требует дополнительных знаний внутренностей.
В чем эта рискованность проявляется по-вашему?

Цитата Сообщение от Artem_Pv Посмотреть сообщение
а именно опыт применения.
Применяю (не обязательно перечисленные вами, но и другие варианты, в зависимости от ситуации) в 100% своих проектов на протяжении 18 лет.
1
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
07.07.2019, 18:50
Цитата Сообщение от Artem_Pv Посмотреть сообщение
какова польза “умных” указателей?
польза в том что бы не беспокоиться о delete
надо просто понять какой указатель как работает
что бы знать когда этот смарт поинтер перестает владеть ресурсами

а знать внутренности полезно но не обязательно
в основном это нужно что бы понимать сколько именно придется заплатить за удобство
1
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
07.07.2019, 19:03  [ТС]
Цитата Сообщение от Undisputed Посмотреть сообщение
польза в том что бы не беспокоиться о delete
Это немного странно,
пару книг по C++ я прочитал, там навязывают мнение, что, наоборот: "о вызове delete надо беспокоситься." и это обязанность программиста.

Пожалуйста, объясните:
зачем, при динамическом выделении памяти, программиста отучать от delete?
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
07.07.2019, 19:08
Если "умные" указатели не смешивать с классическими указателями, то всё работает вполне безопасно.
0
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
07.07.2019, 19:09  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В чем эта рискованность проявляется по-вашему?
Как раз хочу понять "пользу" умных указателей, чтоб сравнить с "негативной" стороной(а может ее нет)

P.S.
В чем риск?!
Предположим, программист не знает внутренностей "умных" указателей, и он захочет использовать адресную арифметику, т.к. для простых указателей это нормально.
0
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
07.07.2019, 19:11
Цитата Сообщение от Artem_Pv Посмотреть сообщение
"о вызове delete надо беспокоситься." и это обязанность программиста.
я бы внес поправку: это обязанность программиста, который не использует смарт поинтер
хотя в некоторых случаях даже используя смарт поинтер надо беспокоиться о delete (это нестандартные ситуации, где применяется пользовательская функция для освобождения ресурсов).

Цитата Сообщение от Artem_Pv Посмотреть сообщение
зачем, при динамическом выделении памяти, программиста отучать от delete?
ну не то что бы отучать. просто вам как бы предлагается более удобный и безопасный вариант в виде смарт поинтера
1
19423 / 10040 / 2446
Регистрация: 30.01.2014
Сообщений: 17,701
07.07.2019, 19:15
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Пожалуйста, объясните:
зачем, при динамическом выделении памяти, программиста отучать от delete?
Естественно ни о каком "отучении" речь не идет.
Умные указатели нужны для того, чтобы автоматизировать контроль за временем жизни ресурса (динамического объекта, как частный случай). Чтобы код была написан так, что забота о корректном освобождении ресурса ложилась на компилятор (посредством вызова деструктора). Умные указатели - это выражение центральной идиомы С++ - RAII.

Цитата Сообщение от Artem_Pv Посмотреть сообщение
Предположим, программист не знает внутренностей "умных" указателей
Внутренности не надо знать. Нужно знать контракты. Т.е. какое поведение обеспечивает тот и иной инструмент.
3
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
07.07.2019, 19:15
Цитата Сообщение от Undisputed Посмотреть сообщение
безопасный вариант в виде смарт поинтера
вернее не безопасный а надежный в плане управления ресурсами
1
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
08.07.2019, 11:10  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Применяю ... в 100% своих проектов на протяжении 18 лет.
Вот, это то, что внесет ясность.
Пожалуйста, разъясните.

Придерживаясь идиомы RAII, существует два надежных варианта:
1) использовать Автоматические переменные (простые и понятные)
2) использовать “Умные” указатели (сложные и запутанные)

Вопрос:
в каких бытовых случаях “Умные” указатели лучше Автоматических переменных?

Интересует не теория(я ее прочитал), а именно бытовая практика.
Спасибо.
0
19423 / 10040 / 2446
Регистрация: 30.01.2014
Сообщений: 17,701
08.07.2019, 11:13
Цитата Сообщение от Artem_Pv Посмотреть сообщение
1) использовать Автоматические переменные (простые и понятные)
2) использовать “Умные” указатели (сложные и запутанные)
Простите, что сразу не отвечаю на вопрос, но мне интересно, на каком основании вы провели такое разделение?
Умные указатели - это точно такие же автоматические переменные, как и остальные.
1
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.07.2019, 11:20
Цитата Сообщение от Artem_Pv Посмотреть сообщение
На фоне всех этих сложностей, какова польза “умных” указателей?
Могут быть весьма полезны для управления пассивными буферами/хранилищами данных. В некоторых простых случаях и для управления активными сущностями. Т.е. полная эмуляция GC только более эффективная и с корректной работой слабых ссылок и управлением ресурсами в отличие от оригинала. Предназначены в первую очередь для облегчения перехода на плюсы первокурсникам, коим в америках в школах поголовно моск насилуют явой . Как в общем то и вся stl.
Для чего то более серьезного типа обеспечения автоматики взаимосвязей активных объектов малопригодны. Хотя если с бубном поплясать то кое как работать будет но неудобно и неэффективно.
Для этого лучше делать свои специализированные смарты под реалии задачи (как собственно автоматика и задумана в исходе).
Ну а вообще как и вся stl - весьма многого для чего годные за счет того что мало для чего лучшие.
1
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
08.07.2019, 11:21  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
на каком основании вы провели такое разделение?
Извините, если что не так.
Вопросы могут казаться странными или чуть-чуть ”провокационными” , это только для того, чтоб докопаться до истины. Другой цели нет.
Еще раз извините, за подобный стиль вопросов.
0
19423 / 10040 / 2446
Регистрация: 30.01.2014
Сообщений: 17,701
08.07.2019, 11:27
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Извините, если что не так.
Ну так на вопрос-то вы ответите?
В чем смысл такого разделения?

Вот вам пока два примера на подумать (примеры слегка искуственные, но не сказать, что совсем не реалистичные):
Без умных указателей (сможете сами найти проблемное место?):
Кликните здесь для просмотра всего текста
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Some
{
public:
    Some(size_t ac, size_t bc) 
        : a(new int[ac]), b(new int[bc]) // 
    { }
    
    ~Some()
    {
        delete[] a;
        delete[] b;
    }
    
private:
    int * a;
    int * b;
};

С умными указателями:
Кликните здесь для просмотра всего текста
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Some
{
public:
    Some(size_t ac, size_t bc) 
        : a(new int[ac]), b(new int[bc]) // 
    { }
    
    ~Some()
    { }
    
private:
    std::unique_ptr<int[]> a;
    std::unique_ptr<int[]> b;
};

.......................
Еще один без умных указателей:
Кликните здесь для просмотра всего текста
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void some_function(size_t size)
{
    int * p = new int[size];
    if( <some condition>)
    {
        delete[] p; // 1
        return;
    }
    
    //.....
    
    some_other_function(); // may throw exception 
    
    if( <some other condition>)
    {
        delete[] p; // 2
        return;
    }
 
    //.....
    
    delete[] p; // 3
}

С умными указателями:
Кликните здесь для просмотра всего текста
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void some_function(size_t size)
{
    std::unique_ptr<int[]> p( new int[size] );
    if( <some condition>)
    {
        return;
    }
    
    //.....
    
    some_other_function(); // may throw exception 
    
    if( <some other condition>)
    {
        return;
    }
 
    //.....
}
2
 Аватар для Kastaneda
5232 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
08.07.2019, 11:33
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Т.е. полная эмуляция GC только более эффективная и с корректной работой слабых ссылок
Да ну?
1
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
08.07.2019, 11:36  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну так на вопрос-то вы ответите?
Все просто. У человека, который впервые открыл учебник по C++ две недели назад, знания языка формируются обрывками.
И вот этими обрывками пытаюсь сложить картину, поэтому так странно выглядит.
Т.е. к моим вопросам надо проще относиться
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
08.07.2019, 11:39
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Вопросы могут казаться странными или чуть-чуть ”провокационными” , это только для того, чтоб докопаться до истины. Другой цели нет.
Истина в том, что всегда, за редкими исключениями, нужно использовать умные указатели.
Единственный вопрос, который здесь должен возникать, это когда использовать unique_ptr, а когда shared_ptr/weak_ptr.
0
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
08.07.2019, 11:44  [ТС]
C++ Скопировано
1
2
3
4
5
6
7
8
9
private:
    int * a;
    int * b;
};
...
private:
    std::unique_ptr<int[]> a;
    std::unique_ptr<int[]> b;
};
DrOffset,
спасибо за примеры, чуть позже я их буду разбирать подробнее.

А сейчас лишь хотел пояснить, что мой вопрос о сравнении “умных” указателей с автоматическими переменными (а не с обычными указателями).
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.07.2019, 11:45
Цитата Сообщение от Kastaneda Посмотреть сообщение
Да ну?
Да вот именно так и есть.
0
19423 / 10040 / 2446
Регистрация: 30.01.2014
Сообщений: 17,701
08.07.2019, 11:52
Цитата Сообщение от Artem_Pv Посмотреть сообщение
что мой вопрос о сравнении “умных” указателей с автоматическими переменными (а не с обычными указателями).
Этот вопрос некорректен в своей постановке.
На это я и пытаюсь вам намекать.
А вы про какое-то сложное отношение к вашим вопросам говорите

Добавлено через 6 минут
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Предназначены в первую очередь для облегчения перехода на плюсы первокурсникам, коим в америках в школах поголовно моск насилуют явой
Интересно, а вы в курсе, что smart pointers как концепция, старше Java как минимум лет на 5?
Например, вот статья из C Users Journal от 1992 года: https://collaboration.cmc.ec.g... wagner.htm
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.07.2019, 11:52
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Рекурсивные типы в 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-х годов был периодом глубоких трансформаций в области хранения и обработки данных. На фоне растущих потребностей бизнеса и правительственных структур существовавшие на тот. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер