-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
1

Использование умных указателей

11.02.2016, 13:39. Показов 1323. Ответов 19
Метки нет (Все метки)

В каких случаях вы используете умные указатели, а в каких обычные?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2016, 13:39
Ответы с готовыми решениями:

Использование умных указателей
Всем привет! Недавно наконец попробовал использовать умные указатели и мне понравилось, но...

Правильное использование умных указателей, как членов класса
Допустим у нас есть класс Node, объекты которого могут хранить вложенные Node, как правильнее...

Подсчет умных указателей
Здравствуйте! Столкнулся с проблемой реализации умных указателей . Совсем не выходит написать...

Приведение типов умных указателей
Добрый день. Реализовал простенький умный указатель с подсчетом ссылок. template<typename...

19
Модератор
Эксперт С++
12443 / 10007 / 6025
Регистрация: 18.12.2011
Сообщений: 26,791
11.02.2016, 13:48 2
Вопрос несколько странный.
Умный указатель используется, если для класса перегружен operator->
0
Don't worry, be happy
17769 / 10534 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 1
11.02.2016, 13:50 3
Цитата Сообщение от Knjagskij Посмотреть сообщение
В каких случаях вы используете умные указатели, а в каких обычные?
когда надо следить за ресурсом - умные,
когда не надо - обычные
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
11.02.2016, 13:51 4
Цитата Сообщение от zss Посмотреть сообщение
Умный указатель используется, если для класса перегружен operator->
чеэто...
умный указатель использовать 1) если пишите на с++
2) если есть поддержка 11го стандарта(или есть возможность подключить boostlib)
3) чтобы автоматически освобождать ресуры
0
5224 / 3196 / 362
Регистрация: 12.12.2009
Сообщений: 8,101
Записей в блоге: 2
11.02.2016, 13:51 5
Цитата Сообщение от Knjagskij Посмотреть сообщение
В каких случаях вы используете умные указатели, а в каких обычные?
если доступны умные, то использую умные, если нет, то обычные.

Не по теме:

Чувствуется вопрос от препода ВУЗа - нужно ответить не так, как правильно, а так как надо :D Помнится тоже в тесте отвечал, что HTML файл - это файл, который содержит ссылки на другие файлы :D

1
Модератор
Эксперт С++
12443 / 10007 / 6025
Регистрация: 18.12.2011
Сообщений: 26,791
11.02.2016, 13:54 6
aLarman, Понятие умного указателя появилось задолго до 11 стандарта,
и основано именно на перегрузке operator->
0
5224 / 3196 / 362
Регистрация: 12.12.2009
Сообщений: 8,101
Записей в блоге: 2
11.02.2016, 13:57 7
Цитата Сообщение от zss Посмотреть сообщение
и основано именно на перегрузке operator->
мне кажется все дело в RAII, нет?
0
Don't worry, be happy
17769 / 10534 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 1
11.02.2016, 13:58 8
Цитата Сообщение от Kastaneda Посмотреть сообщение
мне кажется все дело в RAII, нет?
Нет, в конструкторах и деструкторах
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
11.02.2016, 13:59 9
Цитата Сообщение от zss Посмотреть сообщение
aLarman, Понятие умного указателя появилось задолго до 11 стандарта,
и основано именно на перегрузке operator->
ну это же не причина для его использования или неиспользования
Понятие то появилось а реализовали в 11ом, а самому зачем велосипеды изобретать, да и еще потом ловить ошибки на своём умном указателе
0
5224 / 3196 / 362
Регистрация: 12.12.2009
Сообщений: 8,101
Записей в блоге: 2
11.02.2016, 14:05 10
Цитата Сообщение от aLarman Посмотреть сообщение
Понятие то появилось а реализовали в 11ом
раньше были std::auto_ptr, они и сейчас остались, но считаются deprecated
Цитата Сообщение от Croessmah Посмотреть сообщение
Нет, в конструкторах и деструкторах
не совсем понятно, шутка или нет?
0
Don't worry, be happy
17769 / 10534 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 1
11.02.2016, 14:05 11
Умные указатели это не только ценный мех...
В общем, читайте книжку Джеффа Элджера "Библиотека программиста C++",
она почти вся про разум указателей и программистов.

Добавлено через 23 секунды
Цитата Сообщение от Kastaneda Посмотреть сообщение
не совсем понятно, шутка или нет?
Конечно.
0
Kastaneda
11.02.2016, 14:06
  #12

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Конечно.
конечно да или конечно нет? :)

0
Croessmah
11.02.2016, 14:08
  #13

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
конечно да или конечно нет?
угу :D когда я писал серьезно на такие темы? :D

0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
11.02.2016, 14:52  [ТС] 14
Как я понял, рекоменуется их использовать всегда, кроме того случая, когда вам насильственно запрещают использовать 11 стандарт, Qt, Boost?
0
Эксперт С++
8704 / 4288 / 954
Регистрация: 15.11.2014
Сообщений: 9,729
11.02.2016, 19:31 15
Цитата Сообщение от Knjagskij Посмотреть сообщение
Как я понял, рекоменуется их использовать всегда, кроме того случая, когда вам насильственно запрещают использовать 11 стандарт, Qt, Boost?
всегда, когда они нужны
и никогда, когда не нужны.

Кэпа можно не благодарить.
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
12.02.2016, 09:17  [ТС] 16
Неужели так сложно написать, когда их нужно использовать, Кэп, в этом-то и заключался вопрос, изначально

Добавлено через 1 минуту
Croessmah, разве, не всегда нужно следить за ресурсом?
0
Эксперт по математике/физикеЭксперт С++
1995 / 1325 / 379
Регистрация: 16.05.2013
Сообщений: 3,430
Записей в блоге: 6
12.02.2016, 10:04 17
Лучший ответ Сообщение было отмечено Knjagskij как решение

Решение

Цитата Сообщение от Knjagskij Посмотреть сообщение
Неужели так сложно написать, когда их нужно использовать, Кэп, в этом-то и заключался вопрос, изначально
Условно указатели можно разделить на две категории: те которые не владеют ресурсами и те которые ими владеют.
Например:
Указатель не владеет ресурсами:
C++
1
2
3
4
5
6
//z.B. N1
int x = 11;
int * ptr = &x;
//z.B. N2
std::vector<int> coll{10, 11, 12};
int * it = &coll[0];
Указатель владеет ресурсами:
C++
1
int * ptr = new int(11);
В отличии от первой категории для указателей владеющих ресурсами необходимо следить за освобождением ресурсов при любом способе выхода из блока будь то исключение или нормальный выход. Например:
C++
1
2
3
4
5
6
7
8
try {
    int * ptr = new int(11);
    procces(ptr); //Возможна генерация исключения
    delete ptr;
}
catch(...) {
    delete ptr;
}
Это стандартный блок обработки захват/освобождение ресурса в случае если между выделением памяти и ее освобождением возможна генерация исключения. Данный подход позволяет избежать утечки, освобождая выделенную память при любом выходе из блока try. Однако данный подход не совсем эффективен.
Умные указатели используют идиому RAII (захват ресурса есть инициализация) захватывая владение выделенной динамической памятью и освобождая ее в своем деструкторе. К примеру приведенный выше код можно переписать с использованием умных указателей следующим образом:
C++
1
2
3
4
{
    std::shared_ptr<int> ptr(new int(11));
    procces(ptr); //Возможна генерация исключения
}
Стандарт гарантирует, что в сллучае возникновения исключения начнется раскрутка стека и будут вызваны деструкторы всех локальных объектов в данном случае деструктор ptr. Однако вызов деструктора приведет к вызову delete для хранимого указателя. Тоже произойдет в случае нормального выхода из блока.
Таким образом использование идиомы RAII позволяет сократить и упростить код оставляя тем не менее его безопасным в смысле исключений.
3
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
12.02.2016, 10:56  [ТС] 18
Ilot, т.е. все указатели, владеющие ресурсами, желательно делать умными, кроме самых тривиальных ситуация?
0
Эксперт .NET
10699 / 7443 / 1164
Регистрация: 21.01.2016
Сообщений: 28,192
12.02.2016, 11:46 19
Knjagskij, ну если указатели, владеющие ресурсами, сами находятся во владении некоего объекта, который гарантирует их своевременное удаление (в нужный момент), то делать такие указатели умными необязательно.

Добавлено через 7 минут
Например, некий объект при запуске программы выделяет какие-то ресурсы и хранит на них ссылки (и сам живёт до завершения приложения). Остальной код приложения спокойно может запрашивать ссылки на эти ресурсы у класса-владельца и пользоваться ими. При завершении работы, владелец высвободит ресурсы. При таком сценарии, когда владелец только один, использовать умные указатели смысла нет.

А вот, если ресурс выделяется, а кто и когда его будет высвобождать неясно, то тут smart pointers, что называется, "в кассу".
0
Эксперт С++
8704 / 4288 / 954
Регистрация: 15.11.2014
Сообщений: 9,729
12.02.2016, 19:53 20
Цитата Сообщение от Knjagskij Посмотреть сообщение
Неужели так сложно написать, когда их нужно использовать, Кэп, в этом-то и заключался вопрос, изначально
когда в них есть нужда, очевидно жеж.
Кэп.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2016, 19:53
Помогаю со студенческими работами здесь

Подскажите как переписать класс с использованием умных указателей, либо STL
К сожалению, знания об умных указателях и библиотеке STL прошли мимо меня... Сейчас пытаюсь...

Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя.
Помогите пожалуйста!!!!!!! Сделать три варианта: первый вариант – передача данных между...

Использование указателей
я не могу понять как работает эта задача: long A={ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,...

Использование указателей
Здравствуйте, немного не понимаю как правильно использовать указатели, например, я знаю, что при...

использование указателей
Подскажите, пожалуйста, в чем здесь ошибка? #include &lt;iostream&gt; using namespace std; int x =...

использование указателей
Должна быть разработана программа с меню с использованием указателей: 1. Изменить порядок...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru