Умные указатели. Smart pointers. Изучение С++ для начинающих. Урок
В этом уроке мы рассмотрим в чём суть умных указателей в языке программирования C++
Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)
Без этого вы не станете программистом! Найти ошибку в коде. Отладка. Как пользоваться отладчиком #23
goo.gl/Jd1AYS
Что такое динамическая память. Утечка памяти. Стек и куча. Статическая память. Обзорный урок #45
goo.gl/dsCUft
Указатели c++ что это. Для чего нужны. Указатели c++ разыменование. C++ для начинающих. Урок #46
goo.gl/JT6sTT
new c++ что это. new c++ пример. c++ new delete. delete c++ что это. delete c++ пример. Урок #53
goo.gl/xyiJdp
Перегрузка операторов пример. ООП. Перегрузка оператора присваивания. C++ Для начинающих. Урок#83
goo.gl/SF62AZ
Шаблоны классов с++ примеры. Обобщенные классы. Изучение С++ для начинающих. Урок #126
goo.gl/ogjKyy
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
Если вам нравятся мои уроки, вы хотите поддержать меня и развитие канала, то можете сделать это тут!=)
🔴🔴🔴 www.donationalerts.ru/r/simple...
или тут
🔴🔴🔴 / simplecode
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
Уроки по программированию
Наша группа ВК smplcode
Подписывайтесь на канал / @simplecodeit
Пікірлер: 167
*Не забывайте заглядывать в описание, там много полезных ссылок!*
@kosbarable
5 жыл бұрын
Я правильно понимаю, что вся разница между "умным" указателем и "неумным" лишь в том, что адрес умного хранится на стэке и по этой причине, при выходе программы из фигурных скобок, где тот был объявлен, происходит автоматический вызов его деструктора? Хотя пересмотрел ролик, но умный то создаётся оператором new -- а это опять динамическая память! Значит без вызова delete будет утечка?
@bobrovskij100
4 жыл бұрын
Сергей запишите, пожалуйста, видео как определять асимптотическую сложность алгоритмов.
Урок, который идёт 24 минуты, пролетел за секунду. Было очень интересно. Спасибо!
Спасибо за бесценный труд!)
Спасибо большое за видеоуроки!
Интересно, спасибо!
Благодарю за урок!
Smart Like!
Утечка памяти - это самое лайтовое при работе с динамической памятью, вот исключения - это ещё то мозгодолбство, как же они меня в край затрахали когда я выделял ее под объекты в моем большом проекте. Моё любимое: "Куча была повреждена" - и ты как бы такой смотришь и думаешь : "зшб" - ведь это даже от тебя не зависит
#умныеуказатели #smartpointers #SimpleCode #урокипрограммирования
Огромное спасибо!
Спасибо за интересную подачу материала и грамотные и понятные примеры. Побольше бы таких учителей, как вы) Уже в С++ не первый год, а все равно даже в самых первых ваших уроках и сегодня нахожу что-то новое. Надеюсь вы и дальше будете вести людей через дебри С++✌🏻
@user-or1hy4xz8u
2 жыл бұрын
не первый год учишь или не первый год работаешь в С++?
@user-is3jb6mi4g
2 жыл бұрын
не первый год учу, но до этого было очень много перерывов. Вот сейчас поступил в универ и учу каждый день, поэтому ситуация лучше
Благодарю!!!
Спасибо большое!
Я очень мало знаю про ООП, но почти все уроки до него я посмотрел. И понял данное видео примерно на 55%. Я рад. C++. Хочу на работу!
@daps9516
Жыл бұрын
Уже что-то знаю про ООП. Примерное представление инкапсуляции, наследования, полиморфизма есть. Но чет боюсь, что в процессе изучения ООП, могу позабыть про стандартные алгоритмы.
@adominebletwel1317
Жыл бұрын
@@daps9516 не забудешь, но советую раз в месяц просто пробежаться по названиям видео из плейлиста, если что то забыл пересмотреть такое видео
@daps9516
10 ай бұрын
А я теперь изучаю Блокчейн и решаю задачи на leetcode) Ну и плюсы тоже все еще ботаю. Куда без них
@randomcraft2345
Ай бұрын
Советую не просто ботать и не просто решать искусственные задачи на алгоритмы, но и делать pet проекты. Они тоже могут быть искусственным, особенно по началу, но быстро могут перерости в значимые и прикладные. В своём pet проекте сможешь одновременно все возможности плюсов отработать, и кучу алгоритмов написать), вопрос только, какой именно проект будешь делать. А самое главное преимущество от этого - можно будет показать свой проект при трудоустройстве, и скорее всего, это покажет вас с лучшей стороны (особенно, если будет виден прогресс с ходом времени). Ну, и советую делать проект сразу на GitHub, история коммитов подтвердит подлинность проекта.
Большое спасибо за урок!
Это лучшее что есть в рунете. Огромное спасибо.
Отлично объясняете,Спасибо вам!
спасибо за качественный урок.
@SimpleCodeIT
6 жыл бұрын
Пожалуйста!
О да! Очень интересно! Спасибо Сергей! Браво!
Спасибо!
и снова большое спасибо)
Супер спасибо.
Отличный урок! Спасибо)
большое спасибо за отличный урок!!
Благодарю!
Супер!
спасибо за урок хочу добавить что в этом же деструкторе можно анулить сылку с помощью nullptr
Спасибо за урок.
Krasavchik
Жалко что только что нашел твой канал :( Я сейчас на четвертом твоем уроке остановился, но обязательно тебя догоню!
@glebko732
4 жыл бұрын
Уже догнал?
@niazgatin6482
3 жыл бұрын
@@glebko732 нет все послал на х*й и бросил)
@lunaryx9719
Жыл бұрын
@@glebko732 а сейчас догнал?
балдежный урок, прекрасно объяснено!
This is really a new word in science and technology and in programming in C++
Отличный урок, спасибо. Подписался)
спасибо!
Спасибо Сергей за урок!
Спасибо за урок
Дякую!
Отличный урок! Спасибо! Не могли бы, пожалуйста, ответить на вопрос: " Когда предположительно будут Динамические структуры данных?"
@SimpleCodeIT
6 жыл бұрын
Пожалуйста, в ближайшие 2 недели.
Спасибо
Какой то адский урок ! )))
спасибо
Только не забудьте, что реализация шаблонных методов класса д.б. в. h файле
не нарадуюсь, что нашла Сергея. А ведь все началось с запроса в гуголе про константный указатель на константу))))))
@_Yes_.
Жыл бұрын
lol
очень удивляет количество лайков. лучшие уроки по плюсам на рус ютубе и вот такое...
Спасибо за качественный контент
Thank you for the lesson!
Спасибо)
привет из 2023. Спасибо большое за уроки!
Недавно начал изучать С++, пока что на 4 уроке. Глянул что вышел 130 урок и офигел, я же С++ буду года два где-то учить xd
@denden4455
6 жыл бұрын
Rockstar Ra-Ta Yaroslav Kastushkin За три дня дошел до этого урока на скорости x2)))))
@dml1207
6 жыл бұрын
Я за 2 месяца на обычной скорости.
@user-sx3co8ju6w
5 жыл бұрын
Я уже год учу, но и параллельно уже работаю над своими проектами
@TheWladberlin
4 жыл бұрын
@@denden4455 Ты офигел, как можно их усвоить за три дня?! Тем более на скорости х2, когда половину слов перестаешь разбирать, это круто! Если ты за три дня не просто просмотрел, а по-настоящему усвоил темы - ты вундеркинд, снимаю шляпу)).
@user-uj6je7uc7h
4 жыл бұрын
ну что, выучил?)
Темная сторона привлекла тебя, о любитель Visual Studio. Помни: тьма сгущается перед рассветом.
В Unreal C++ gc автоматический, но только если использовать макросы UPROPERTY(), UENUM() или UFUNCTION()
в данном случае мы можем вывести значение разименованного, то есть *pointer, как вывести адрес? то есть pointer?
пока посмотрел все 150 роликов. Очень сильно помогло.
@_Yes_.
Жыл бұрын
putin?
Благодарю за уроки! Подскажите, а где правильнее nullptr присвоить? в деструкторе SmartPointer?
@user-rj7cf4sf6d
2 жыл бұрын
в конструкторе по умолчанию
@user-or1hy4xz8u
2 жыл бұрын
@@user-rj7cf4sf6d а почему не в деструкторе??
Вопрос. Имхо, не совсем понятен момент где pointer = new int(5). pointer является объектом класса, а new int становится полем класса. Чтобы было правильно, следовало перегрузить также оператор "=", чтобы new int присваивался именно нужному полю. Здесь происходит неявное присваивание значения полю класса средствами языка, а нужен эквивалент команды "smaprtointer pointer = smartpointer (new int(5))".
@ifelse9664
5 жыл бұрын
Отвечу, может кому пригодится .В данном случае new int становится полем класса через конструктор. Например запись smartpointer smartp = new int(87); Аналогична записи smartpointer smartp (new int(87)); То есть при записи smartpointer p = new int(87); сначала создается объект в правой части с помощью коструктора, потом smartp приравнивается этому объекту (это происходит с помощью оператора = по умолчанию). (но я могу и ошибаться)
@pubgr862
5 жыл бұрын
this->ptr = ptr; это разве неявное присваивание?
@1Dpyr
9 ай бұрын
Да, здесь происходит неявное преобразование типов... Если к конструктору класса добавить ключевое слово explicit, то компилятор не пропустит такой код (SmartPointer ptr = new int(5);) сообщит о не явном преобразовании. Только такой код пропустит SmartPointer ptr(new int(5);
Сергей, здравствуйте. Скажите пожалуйста, когда мы в функции main через оператор new возвращаем указатель на те данные, где хранится значение 5, а потом передаем их в конструктор, то куда они потом идут? Получается, когда мы присваиваем данные указателю в конструкторе, он указывает на ту же область памяти, которую мы выделили под значение 5?
@user-vs6kl8ph5v
Жыл бұрын
да, на ту же. если посмотреть значения this и параметра ptr в режиме отладки в моменты вызова конструктора, то там видно, что this начинает указывать туда же, куда параметр
@romaniancoder5187
Жыл бұрын
@@user-vs6kl8ph5v за ответ спасибо, правда, за 5 лет я уже сильно отошел от плюсов )
не подскажете, почему не получается поместить в переменную класса SmartPointer указатель именно на МАССИВ int.
@gavyttop1341
2 жыл бұрын
для массивов нужна своя реализация)) т.к нужно удалять не просто delete ptr, а delete [] ptr как для массива;
Good luck to you, Sergei! Promote your channel and you in work and life, a million subscribers to the channel !!! )))
Получается внутри базового объекта создаётся новый, который является ссылкой на 1.
спасибо за крутой урок!
Деструктор активируется при выходе из зоны видимости любой функции? Я думал только из main'а.
Добрый день. А если я просто сделал геттер(или сетер чтоб работать с нашими данными) к нашему указателю, зачем перегружать оператор? В чём вообще разница? Буду благодарен а ответ.
@user-or1hy4xz8u
2 жыл бұрын
наверно, геттер здесь не нужен...
как включить пунктирную линию между фигурных скобок
@kolosrodoskyi
6 жыл бұрын
Установить расширение Indent Guides на VS
А как в примере из видео получилось вывести в адрес и значение указателя, не прегружая оператор
@unukhtv7196
Жыл бұрын
Так он оператор * написал.
@bleeding333
Жыл бұрын
@@unukhtv7196 мне писало, что для ostream для *pointer не реализовано, пришлось писать самому
Можешь объяснить, пожалуйста, что такое: DWORD, HANDLE?
@user-xj5fh6nk9y
5 жыл бұрын
Не совсем, dword - шестнадцатиричное число, а handle сам точно не помню, вроде обьект для получения доступа к другому процессу
@svvonline1
Жыл бұрын
DWORD - 32-битное беззнаковое целое. HANDLE - переопределенный тип переменной для манипулции объектом, обычно это указатель.
Нехорошо одинаково именовать данные-члены класса и формальные параметры метода.
@svvonline1
Жыл бұрын
Это вопрос стиля и внимательности.
@Russian-Stalinist
Жыл бұрын
@@svvonline1 Самый лучший тиль для приватных данных: Class(T var) : variable_{var) {}
а как же умный указатель для освобождения памяти массива? в данном классе будет очищаться лишь первый элемент массива, так как не было применено delete[]. мне кажется, что в данном случае нужен спецификатор шаблона класса, который бы работал через шаблон, а в его деструкторе описывалось бы delete[] ptr.
@kayforwarr5706
7 ай бұрын
Всё верно, но этом уроке показана общая идея, а частные случаи, вероятно, будут разобраны в следующем уроке т.к. std::unique_ptr/std::make_unique - как раз об этом.
@viper_0097
3 ай бұрын
Можно сделать массив умных указателей, хотя инициализировать будет трудно
Что будет, если я объявлю указатель в стеке и создам с его помощью умный указатель из этого урока? После выхода из зоны видимости освободится и место в стеке, и сработает деструктор умного указателя?
@RoadToFuture007
3 жыл бұрын
Если я Вас правильно понял и Вы хотите в стеке создать обычный указатель на умный указатель, то такой фокус наверно не выйдет: Вы стерете/потеряете просто указатель на умный указатель, а сам умный указатель (память зарезервированая за ним и его содержание) останется висеть в куче (?) Тут нужен вумный указатель на умный указатель-2, в котором будет реализована автоматическая очистка этих умных указателей-2 . Я думаю, это реализуемо.
почему не сделать этот нью в конструкторе смарт птр? смысл же в этом вроде
Ваши уроки - Сокровище. Спасибо
А зачем нужно перегружать *, если мы итак получаем данные, лежащие по указателю, с помощью неперегруженной *?)
@kosbarable
5 жыл бұрын
затем, что оператор звёздочка не определённый в декларируемом классе просто не сработает в коде, если только не сделать доступ до самого поля с обычным указателем (вынести его из private в public) и не применить оператор уже к нему) Но тогда встаёт вопрос об инкапсуляции)
@jsgaming9839
5 жыл бұрын
оператор * у shared_ptr вернет **int я так понял, а нам нужен *int. Так что перегружать надо.
@vladportnov3041
4 жыл бұрын
так как неперегруженный * дает указатель на объект, а не на наше поле ptr
А как освободить память (вызвать деструктор), если в конструкторе возникла ошибка (исключение)?
@alexeypatrushev8645
6 жыл бұрын
Спасибо за ответ. Я примерно так и предполагал, просто заострил внимание на место где может возникнуть проблема.
Не совсем понял момент с перегрузкой *. Ведь звездочка - это и так по дефолту значит "разыменование указателя"(
@FrenzyNull
Жыл бұрын
Не только - это выделение динамической памяти
@voxel1547
Жыл бұрын
@@FrenzyNull выделение - это new, а указатель это собственно указатель на память где хранится что-то, например выделенная память
Поправьте меня если я не прав, но у вас в деструкторе написан оператор delete без []. Таким образом если мы передадим указатель на массив, то получим неправильную работу программы.
@gavyttop1341
2 жыл бұрын
[] используется для масивов не так ли?
Зачем нужен setlocale(LC_ALL, "ru"); ?
@FrenzyNull
Жыл бұрын
Чтобы поддерживать русскую раскладку
19:36 понятие не имею как этот отладчик запустить....
@shoorikefimov6759
4 жыл бұрын
Для VS F10 или зеленая стрелка с надписью "Локальный отладчик Winows". Перед запуском надо поставить точку останова на интересующем участке кода.
Бллллл, теперь у меня первая асоциация вызываемая при упоминании C++, как думаете, какая? ПЕРЕГРУЗКА
Если кто-то смотрит спустя 6 лет, как в 104 строчке объекту типа SmartPointer присваивается указатель на int? почему отрабатывает конструктор, а не выводится ошибка об отсутствии перегрузки оператора=?
@TurboGamasek228
2 ай бұрын
так это стандартная операция, ты же не обьект класса присваиваешь обьекту класса
@BlackFireTop
2 ай бұрын
@@TurboGamasek228 да, не объект объекту Но указатель объекту То есть это же всё равно, что объекту присваивать число В любом случае, спасибо за ответ, я не думал, что оно так должно отработать🤔
блин я в этом синтаксисе уже начинаю плавать.
0:55 поэтому нам дали ту хуйню?)))
Ошибка. C++ не существует подходящего конструктора для преобразования
Меня глючит или на фоне очень тихо играет мелодия с Наруто или какой-то рок?
@user-or1hy4xz8u
2 жыл бұрын
тебя глючит.
посиб, лучше понял qt
Уроки замечательные, воть только 3 вещи непонятно. Для структур есть свои контейнеры у которых деструкторы собственные. Нафига тогда козе баян со smart_ptr (shared_ptr). Есть try ... catch на случай охрененных ветвлений. Опять непонятно нафига козе баян. Для многопоточности свои механизмы контроля доступа к данным. Я чего-то не понимаю или smart_prt заточены под многопоточные программы. Если нет - нахрен вообще этот smart_ptr? И, кстати для функции foo( const T & value ){ return T*) класс накроется медным тазом. Перегружать надо константное разименование тоже имхо.
@user-or1hy4xz8u
2 жыл бұрын
просто структуры остались от С и под них приходится точит соотв. инструменты...
Благодарю за урок!
спасибо
спасибо
спасибо