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

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

07.07.2019, 18:14. Показов 7151. Ответов 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
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.07.2019, 13:28
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Croessmah Посмотреть сообщение
угу. В этом его соль.
он будет еще соленее
если добавить delete после блока catch
что приведет к UB в случае когда будет брошено исключение
вообщем то думаю ТС было бы полезно поразмышлять над всем этим самому
а там и на раскрутку стека наткнется и прочее что из этого вытекает
думаю это было бы полезно для него
0
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
08.07.2019, 13:45  [ТС]
Вопрос:
в каких бытовых случаях “Умные” указатели лучше Автоматических переменных?


Всем спасибо, кто отвечает, хоть и намеками, но истина раскрывается.

Новый вопрос:
в С++ , кроме динамических массивов, есть еще типы, которые не могут быть автоматическими переменными?

... другими словами:
Есть ли типы данных, которые можно создать только оператором new (иначе никак) ?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
08.07.2019, 13:49
Цитата Сообщение от Undisputed Посмотреть сообщение
что приведет к UB в случае когда будет брошено исключение
Там поведение вообще серьезно отличается от нужного.
Например, в catch не выбрасывается исключение дальше.
C++
1
2
3
4
5
6
7
8
9
10
11
void f()
{
    int * p = new int;//Без try
    try { //Весь остальной код под защитой
        function_which_can_throw_exception();
    } catch (...) {
        delete p;
        throw;
    }
    delete p;
}
Если добавить пару указателей, то будет веселее.
C++
1
2
3
int * p1 = new int;//ок
int * p2 = new int;//возможна утечка
int * p3 = new int;//возможна еще большая утечка
Значит new тоже должны быть под защитой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
resource * p1 = nullptr;
resource * p2 = nullptr;
resource * p3 = nullptr;
try {
    p1 = new resource;
    p2 = new resource;
    p3 = new resource;
    function_which_can_throw_exception();
    if (function_return_error_code()) {
        throw some_error();
    }
} catch (...) {
    delete_all(p1, p2, p3);//применяет delete к переданным указателям
    throw;
}
delete_all(p1, p2, p3);//применяет delete к переданным указателям
т.е. код обработки ошибок значительно усложняется даже в таком простом случае.
Также можно упомянуть о возврате умных указателей из функции.
C++
1
2
3
4
5
6
unique_ptr<resource> make_resource()
{
    unique_ptr<resource> p = make_unique<resource>();
    //...
    return p;    
}
С голым указателем нет гарантии освобождения ресурса внешним кодом.
Но мы же знаем, что никогда не забудем освободить ресурс.
Код выше с применением умных указателей упрощается:
C++
1
2
3
4
5
6
7
resource * p1 = make_resource();
resource * p2 = make_resource();
resource * p3 = make_resource();
function_which_can_throw_exception();
if (function_return_error_code()) {
    throw some_error();
}
т.е. код упростился и меньше подвержен ошибкам, его дальнейшая модификация также упростилась.

Добавлено через 2 минуты
Цитата Сообщение от Artem_Pv Посмотреть сообщение
в каких бытовых случаях “Умные” указатели лучше Автоматических переменных?
Чего?
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.07.2019, 14:02
Fulcrum_013, а что делали бедные студенты с 2003 года по 2011 в отсутствие стандартных умных указателей?

________________________________________ ____

Вообще говоря, если оторваться от конспирологических теорий про глупых американских студентов, то предложение смартпойтеров в стандарт в марте 2003 года было прямым развитием работы Петра Димова над умными указателями в boost с 2001 по 2002 годы;
Собственно в 2005 году данное предложение уже вошло в TR1 и было реализовано в нескольких популярных компиляторах в качестве раширения std;

К слову, предожение move-семантики, без которой в полной мере невозможно было бы реализовать n1450, появилась еще раньше, в 2002 и тоже затрагивало смартпойнтеры непосредственно. Один из авторов все тот же Петр Димов.

Так что смотрите сами, кому тут верить.
2
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.07.2019, 16:23
Цитата Сообщение от DrOffset Посмотреть сообщение
а что делали бедные студенты с 2003 года по 2011 в отсутствие стандартных умных указателей?
Что и положено делать студентам - свои изобретали. С заходом мультипотока это стало для студентов черезчур круто.

Добавлено через 22 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Вообще говоря, если оторваться от конспирологических теорий про глупых американских студентов, то предложение смартпойтеров в стандарт в марте 2003 года было прямым развитием работы Петра Димова над умными указателями в boost с 2001 по 2002 годы;
Вообще то умными это назвать сложно. Скорее полоумные. Хотя для работы с пассивными буферами сгодятся. Но как бы на какое то универсальное средство не тянут в принципе. Даже тип счетчика не настраиваемый, при том что с атомарками они если и нужны то подавляющее меньшинство. Поэтому и место им в стандартной библиотеке только по одной причине может найтись - штудентам для перехода, бо как не знают еще как правильно параллелить.
Цитата Сообщение от DrOffset Посмотреть сообщение
К слову, предожение move-семантики, без которой в полной мере невозможно было бы реализовать n1450, появилась еще раньше, в 2002 и тоже затрагивало смартпойнтеры непосредственно[/
Один из авторов все тот же Петр Димов.
И я так подозреваю еще во многих дуростях отметился. Не мув сам по себе штука полезная. но так его сговнить нужно было умудрится. а тем более cow-семантику у контейнеров похерить при этом полностью. А эти две семантики прекрасно между собой сочетается и прекрасно аргументом шаблона выбирается какой именно вариант нужен. Вообще на мысль что это для студентов пилят наводит именно то, что через чур топорно делают, и при этом никаких возможностей кастомизации поведения не оставляют. Т.е. тупо не используют возможности подстройки классов под реалии конкретной задачи заложенные в язык и на 5%. Ни для чего кроме студенческих хеллоувердов stl в результате непригодно, но типа пользовать можно не понимая различий семантик и т.д. юсекейсов разных вариантов кастомизаций.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
08.07.2019, 16:44
Fulcrum_013, ты как покемон Мак - куда не зайдешь, везде вонять начинает, и тема в помойку превращается.
Тело Мака источает жидкость, которая ужасно пахнет. Одной лишь капли этой жидкости достаточно, для превращения целого бассейна с чистой водой в воняющее болото.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.07.2019, 19:19
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Новый вопрос:
в С++ , кроме динамических массивов, есть еще типы, которые не могут быть автоматическими переменными?
... другими словами:
Есть ли типы данных, которые можно создать только оператором new (иначе никак) ?
Строго говоря, есть такие типы. Вернее, есть возможность их создавать. Например конструкторы закрыты, а объекты создаются фабрикой в куче. Фабрика возвращает указатель. И это часто бывает смартпойнтер.
Но Artem_Pv, истина не открывается в таких вопросах, для задающего их новичка. Нужна практика (много).
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.07.2019, 19:26
Кстати кто знает как обстоят дела с созданием обьекта минуя конструктор?
То есть если просто выделить кусок памяти, кастнуть к нужному типу и использовать указатель?
Это норм вообще? Конструктор не вызван, лайфтайм не начался... С чем работаем - не понятно

Добавлено через 25 секунд
Навеяно постом IGPIGP
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
08.07.2019, 19:34
Цитата Сообщение от Undisputed Посмотреть сообщение
С чем работаем - не понятно
Что будет в результате - тоже. )
3
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.07.2019, 19:43
Цитата Сообщение от Undisputed Посмотреть сообщение
Конструктор не вызван, лайфтайм не начался... С чем работаем - не понятно
Strict aliasing rule должны разрешать для выделенных массивов как unsigned char[], насколько я знаю. Но каждое приведение требует поста и молитвы. В данном случае простой епитимьи может не хватить и нужно быть готовым к обетам, затворничеству и самобичеванию. имхо.
А удалять придётся серпом по делитом по массиву чар. И предварительным запуском деструктора.
ps вручную форматировать так как это делает компилятор (с конструктором подмышкой) может не случиться)

Добавлено через 8 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
Конструктор не вызван, лайфтайм не начался... С чем работаем - не понятно
Для этого и делают фабрику другом, чтобы запускать закрытые конструктора. Тогда и типы безопасны и волки целы. (Опасные типы едят волков )
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.07.2019, 19:43
Croessmah,
Ок, спасибо )
Но для не классовых типов полагаю проблем быть не должно?

IGPIGP,
Unsigned char можно использовать если размещать там объект через placement new
Тогда будет вызван конструктор и это ОК
А если просто каст, без вызова конструктора, то похожу никакой unsigned char не отдалит от UB
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.07.2019, 19:50
Цитата Сообщение от Undisputed Посмотреть сообщение
если размещать там объект через placement new
Это нормальный путь. А вот если самому заниматься выравниванием и рассчитывать адреса полей - это мазохизм и чернокнижие. Вера это осуждает, насколько я знаю.
Цитата Сообщение от Undisputed Посмотреть сообщение
А если просто каст, без вызова конструктора, то похожу никакой unsigned char не отдалит от UB
оно и не связано. Связано приведение указателя и доступ через типизированный указатель. А UB там не может не быть.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.07.2019, 19:57
Цитата Сообщение от IGPIGP Посмотреть сообщение
А вот если самому заниматься выравниванием и рассчитывать адреса полей - это мазохизм
по секрету: с placement new тоже придется самому выравнивать (если речь идет о реализации аллокатора)
Цитата Сообщение от IGPIGP Посмотреть сообщение
Связано приведение указателя и доступ через типизированный указатель
такое же приведение может работать вполне корректно при условии что объект был сформирован путем вызова конструктора
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.07.2019, 20:08
Цитата Сообщение от IGPIGP Посмотреть сообщение
А UB там не может не быть
угу. А указатель на vmt ему наверное с неба падает а не коструктором проставляется. Так же как и поля наверно все как то из мусора соответствуют тому что должно быть, в том числе указатели все абсолютно такие чтобы он не улетел куда нибудь бороздить просторы большого театра. Так что UB чистейшей воды.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.07.2019, 21:01
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Так что UB чистейшей воды
С кем спорите? Прочтите по буквам:
Цитата Сообщение от IGPIGP Посмотреть сообщение
А UB там не может не быть.
Добавлено через 4 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
по секрету: с placement new тоже придется самому выравнивать (если речь идет о реализации аллокатора)
Не понял. Я говорю о любом классе, где юзер собрался вручную инициализировать кусок сырой памяти.
Цитата Сообщение от Undisputed Посмотреть сообщение
такое же приведение может работать вполне корректно при условии что объект был сформирован путем вызова конструктора
Может. Более того, placement new возвращает типизированный (не void*) как я помню. Случаев когда приведение некорректно всё равно больше чем наоборот.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.07.2019, 21:13
Цитата Сообщение от Artem_Pv Посмотреть сообщение
в С++ , кроме динамических массивов, есть еще типы, которые не могут быть автоматическими переменными?
в с++ не существует динамических массивов.
а так, по большому счету, любой тип можно аллоцировать в куче.
1
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
08.07.2019, 22:48
Undisputed, мне кажется, с POD-типами можно так делать.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.07.2019, 00:19
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я говорю о любом классе, где юзер собрался вручную инициализировать кусок сырой памяти.
с вызовом конструктора или без?

New man,
вот я видел коды где с POD-ами такое делали
но не знаю рабочий ли это код
было бы хорошо еслиб кто нибудь прояснил этот момент ссылаясь на стандарт

Добавлено через 29 минут
IGPIGP,
Ещё хотелось бы уточнить, к чему вы упомянули выравнивание адресов

New man,
Я даже писал такой код и он работал))
1) при работе с сокетами (там используются служебные POD типы), как под виндой так и под линуксом проблем не было
2) при восстановлении сериализованных объектов из файлов
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.07.2019, 00:58
Цитата Сообщение от Undisputed Посмотреть сообщение
с вызовом конструктора или без?
Это было в ответ на ваши размышления о прямой инициализации какой то функцией - не конструктором.
Цитата Сообщение от Undisputed Посмотреть сообщение
IGPIGP,
Ещё хотелось бы уточнить, к чему вы упомянули выравнивание адресов
К тому что когда у вас сырая память и вы её сами размечаете (без компилятора с конструктором подмышкой) то это придётся делать вручную. Я там вроде всё это отметил, как смог.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.07.2019, 01:09
IGPIGP,
Значит я все верно понял
Вопросы возникли потому что не всегда обязательно выравнивать
нужда в выравнивании не зависит от наличия вызова конструктора
Сам по себе выделенный адрес уже выровнен стандартным образом и по этому адресу можно разместить любой объект

То есть мне не понятно как вы связываете необходимость выравнивания при отсутствии вызова конструктора

Добавлено через 1 минуту
И как по вашему вызов конструктора решает эту проблему
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.07.2019, 01:09

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru