Умные указатели. Smart pointers. Изучение С++ для начинающих. Урок

Поділитися
Вставка
  • Опубліковано 16 лис 2024

КОМЕНТАРІ • 170

  • @SimpleCodeIT
    @SimpleCodeIT  6 років тому +55

    *Не забывайте заглядывать в описание, там много полезных ссылок!*

    • @kosbarable
      @kosbarable 6 років тому

      Я правильно понимаю, что вся разница между "умным" указателем и "неумным" лишь в том, что адрес умного хранится на стэке и по этой причине, при выходе программы из фигурных скобок, где тот был объявлен, происходит автоматический вызов его деструктора?
      Хотя пересмотрел ролик, но умный то создаётся оператором new -- а это опять динамическая память! Значит без вызова delete будет утечка?

    • @bobrovskij100
      @bobrovskij100 4 роки тому

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

  • @КінчурВадим
    @КінчурВадим 5 років тому +42

    Урок, который идёт 24 минуты, пролетел за секунду. Было очень интересно. Спасибо!

  • @KurpatovInstagram
    @KurpatovInstagram 6 років тому +13

    Интересно, спасибо!

  • @SimpleCodeIT
    @SimpleCodeIT  6 років тому +11

    #умныеуказатели #smartpointers #SimpleCode #урокипрограммирования

  • @kaynsolo
    @kaynsolo 6 років тому +18

    Smart Like!

  • @ЭрикДеМежьер
    @ЭрикДеМежьер 5 років тому +14

    Спасибо за интересную подачу материала и грамотные и понятные примеры. Побольше бы таких учителей, как вы) Уже в С++ не первый год, а все равно даже в самых первых ваших уроках и сегодня нахожу что-то новое. Надеюсь вы и дальше будете вести людей через дебри С++✌🏻

    • @ДмитрийНормов-ю6ц
      @ДмитрийНормов-ю6ц 2 роки тому

      не первый год учишь или не первый год работаешь в С++?

    • @ЭрикДеМежьер
      @ЭрикДеМежьер 2 роки тому +1

      не первый год учу, но до этого было очень много перерывов. Вот сейчас поступил в универ и учу каждый день, поэтому ситуация лучше

  • @daps9516
    @daps9516 Рік тому +5

    Я очень мало знаю про ООП, но почти все уроки до него я посмотрел. И понял данное видео примерно на 55%. Я рад. C++. Хочу на работу!

    • @daps9516
      @daps9516 Рік тому +1

      Уже что-то знаю про ООП. Примерное представление инкапсуляции, наследования, полиморфизма есть. Но чет боюсь, что в процессе изучения ООП, могу позабыть про стандартные алгоритмы.

    • @adominebletwel1317
      @adominebletwel1317 Рік тому

      ​@@daps9516 не забудешь, но советую раз в месяц просто пробежаться по названиям видео из плейлиста, если что то забыл пересмотреть такое видео

    • @daps9516
      @daps9516 Рік тому +1

      А я теперь изучаю Блокчейн и решаю задачи на leetcode) Ну и плюсы тоже все еще ботаю. Куда без них

    • @randomcraft2345
      @randomcraft2345 7 місяців тому

      Советую не просто ботать и не просто решать искусственные задачи на алгоритмы, но и делать pet проекты. Они тоже могут быть искусственным, особенно по началу, но быстро могут перерости в значимые и прикладные. В своём pet проекте сможешь одновременно все возможности плюсов отработать, и кучу алгоритмов написать), вопрос только, какой именно проект будешь делать.
      А самое главное преимущество от этого - можно будет показать свой проект при трудоустройстве, и скорее всего, это покажет вас с лучшей стороны (особенно, если будет виден прогресс с ходом времени).
      Ну, и советую делать проект сразу на GitHub, история коммитов подтвердит подлинность проекта.

    • @zeliksss9297
      @zeliksss9297 2 місяці тому

      @@randomcraft2345 и можно сделать какой-то пет проект чисто на плюсах? без qt и прочего

  • @elizavetalazareva4719
    @elizavetalazareva4719 Рік тому +1

    Спасибо большое за видеоуроки!

  • @thebat72
    @thebat72 2 роки тому +4

    Это лучшее что есть в рунете. Огромное спасибо.

  • @artlinestudio6735
    @artlinestudio6735 3 роки тому +4

    О да! Очень интересно! Спасибо Сергей! Браво!

  • @johan.de.matan.
    @johan.de.matan. 5 років тому +1

    Утечка памяти - это самое лайтовое при работе с динамической памятью, вот исключения - это ещё то мозгодолбство, как же они меня в край затрахали когда я выделял ее под объекты в моем большом проекте. Моё любимое: "Куча была повреждена" - и ты как бы такой смотришь и думаешь : "зшб" - ведь это даже от тебя не зависит

  • @i4q236
    @i4q236 6 років тому +8

    This is really a new word in science and technology and in programming in C++

  • @kolosrodoskyi
    @kolosrodoskyi 6 років тому +11

    спасибо за качественный урок.

  • @segars9604
    @segars9604 11 місяців тому

    Спасибо за бесценный труд!)

  • @tapirskiy
    @tapirskiy 5 років тому +31

    не нарадуюсь, что нашла Сергея. А ведь все началось с запроса в гуголе про константный указатель на константу))))))

  • @stephandolskii7964
    @stephandolskii7964 2 роки тому +5

    балдежный урок, прекрасно объяснено!

  • @nap0le0nb0naparte7
    @nap0le0nb0naparte7 6 років тому +5

    Большое спасибо за урок!

  • @Ermine882
    @Ermine882 6 років тому +6

    Спасибо за урок.

  • @АндрейМиненко-ц3з
    @АндрейМиненко-ц3з 6 років тому +7

    Спасибо за урок

  • @piseldagrob
    @piseldagrob 6 років тому +11

    Жалко что только что нашел твой канал :( Я сейчас на четвертом твоем уроке остановился, но обязательно тебя догоню!

    • @glebko732
      @glebko732 4 роки тому +7

      Уже догнал?

    • @niazgatin6482
      @niazgatin6482 3 роки тому +2

      @@glebko732 нет все послал на х*й и бросил)

    • @lunaryx9719
      @lunaryx9719 Рік тому

      @@glebko732 а сейчас догнал?

  • @thebat72
    @thebat72 2 роки тому +2

    пока посмотрел все 150 роликов. Очень сильно помогло.

    • @_Yes_.
      @_Yes_. 2 роки тому

      putin?

  • @БогданаДана-у4р
    @БогданаДана-у4р 4 роки тому +1

    Огромное спасибо!

  • @SeshAlex
    @SeshAlex 6 років тому +3

    Благодарю за урок!

  • @Евгений-ф9я3о
    @Евгений-ф9я3о 6 років тому +3

    Благодарю!!!

  • @vaynah9540
    @vaynah9540 6 років тому +7

    Krasavchik

  • @ИгроманРоман-н2ш

    спасибо за урок хочу добавить что в этом же деструкторе можно анулить сылку с помощью nullptr

  • @ИванКозловский-ш9н

    привет из 2023. Спасибо большое за уроки!

  • @i4q236
    @i4q236 6 років тому +14

    Good luck to you, Sergei! Promote your channel and you in work and life, a million subscribers to the channel !!! )))

  • @416группа
    @416группа 6 років тому +9

    Отличный урок! Спасибо!
    Не могли бы, пожалуйста, ответить на вопрос: " Когда предположительно будут Динамические структуры данных?"

    • @SimpleCodeIT
      @SimpleCodeIT  6 років тому +6

      Пожалуйста, в ближайшие 2 недели.

  • @DmitryDolganov
    @DmitryDolganov 5 років тому +1

    Спасибо!

  • @DrUlrih
    @DrUlrih 6 років тому +3

    Только не забудьте, что реализация шаблонных методов класса д.б. в. h файле

  • @C2H5OHH
    @C2H5OHH 3 роки тому +1

    Thank you for the lesson!

  • @Dima-Teplov
    @Dima-Teplov 4 роки тому +2

    Отличный урок! Спасибо)

  • @IT_Enthusiast
    @IT_Enthusiast 6 років тому +5

    Дякую!

  • @rockstarra-tayaroslavkastu2747
    @rockstarra-tayaroslavkastu2747 6 років тому +4

    Недавно начал изучать С++, пока что на 4 уроке. Глянул что вышел 130 урок и офигел, я же С++ буду года два где-то учить xd

    • @denden4455
      @denden4455 6 років тому +1

      Rockstar Ra-Ta Yaroslav Kastushkin За три дня дошел до этого урока на скорости x2)))))

    • @dml1207
      @dml1207 6 років тому +1

      Я за 2 месяца на обычной скорости.

    • @АндрейВоронкин-щ6ф
      @АндрейВоронкин-щ6ф 6 років тому

      Я уже год учу, но и параллельно уже работаю над своими проектами

    • @TheWladberlin
      @TheWladberlin 5 років тому

      @@denden4455 Ты офигел, как можно их усвоить за три дня?! Тем более на скорости х2, когда половину слов перестаешь разбирать, это круто! Если ты за три дня не просто просмотрел, а по-настоящему усвоил темы - ты вундеркинд, снимаю шляпу)).

    • @Mikhail_089
      @Mikhail_089 4 роки тому +1

      ну что, выучил?)

  • @СарматПересветов
    @СарматПересветов 3 роки тому

    и снова большое спасибо)

  • @blackgolddev4023
    @blackgolddev4023 4 роки тому

    Супер спасибо.

  • @kerril1309b
    @kerril1309b 5 років тому +2

    Спасибо за качественный контент

  • @rizroz3955
    @rizroz3955 8 місяців тому

    Спасибо

  • @Timo4eus
    @Timo4eus 6 років тому +6

    Вопрос. Имхо, не совсем понятен момент где pointer = new int(5). pointer является объектом класса, а new int становится полем класса. Чтобы было правильно, следовало перегрузить также оператор "=", чтобы new int присваивался именно нужному полю. Здесь происходит неявное присваивание значения полю класса средствами языка, а нужен эквивалент команды "smaprtointer pointer = smartpointer (new int(5))".

    • @ifelse9664
      @ifelse9664 5 років тому +3

      Отвечу, может кому пригодится .В данном случае new int становится полем класса через конструктор.
      Например запись
      smartpointer smartp = new int(87);
      Аналогична записи
      smartpointer smartp (new int(87));
      То есть при записи smartpointer p = new int(87); сначала создается объект в правой части с помощью коструктора, потом smartp приравнивается этому объекту (это происходит с помощью оператора = по умолчанию).
      (но я могу и ошибаться)

    • @pubgr862
      @pubgr862 5 років тому

      this->ptr = ptr; это разве неявное присваивание?

    • @1Dpyr
      @1Dpyr Рік тому

      Да, здесь происходит неявное преобразование типов... Если к конструктору класса добавить ключевое слово explicit, то компилятор не пропустит такой код (SmartPointer ptr = new int(5);) сообщит о не явном преобразовании. Только такой код пропустит SmartPointer ptr(new int(5);

  • @return_89
    @return_89 9 місяців тому

    Супер!

  • @МендыбаевАлмасАсылханович

    Отлично объясняете,Спасибо вам!

  • @vladalu9794
    @vladalu9794 6 років тому +2

    большое спасибо за отличный урок!!

  • @justodium9896
    @justodium9896 2 роки тому +1

    очень удивляет количество лайков. лучшие уроки по плюсам на рус ютубе и вот такое...

  • @andrewbistroff1199
    @andrewbistroff1199 6 років тому

    Спасибо Сергей за урок!

  • @izvarzone
    @izvarzone 2 роки тому +4

    В Unreal C++ gc автоматический, но только если использовать макросы UPROPERTY(), UENUM() или UFUNCTION()

  • @cakenecake
    @cakenecake 4 роки тому +2

    Отличный урок, спасибо. Подписался)

  • @ЯрославГоловко-ф6и

    спасибо

  • @ivanaaa6049
    @ivanaaa6049 6 років тому

    Темная сторона привлекла тебя, о любитель Visual Studio. Помни: тьма сгущается перед рассветом.

  • @mykhailomorhal2181
    @mykhailomorhal2181 6 років тому +3

    Спасибо)

  • @andriizamoruev5382
    @andriizamoruev5382 5 років тому

    Какой то адский урок ! )))

  • @Km-pn3hf
    @Km-pn3hf 5 років тому

    спасибо!

  • @HugoBossKosta
    @HugoBossKosta 2 роки тому +1

    спасибо за крутой урок!

  • @dimaborovik7857
    @dimaborovik7857 2 роки тому

    в данном случае мы можем вывести значение разименованного, то есть *pointer, как вывести адрес? то есть pointer?

  • @СарматПересветов
    @СарматПересветов 3 роки тому +1

    не подскажете, почему не получается поместить в переменную класса SmartPointer указатель именно на МАССИВ int.

    • @gavyttop1341
      @gavyttop1341 2 роки тому

      для массивов нужна своя реализация)) т.к нужно удалять не просто delete ptr, а delete [] ptr как для массива;

  • @pluto2656
    @pluto2656 6 років тому +3

    как включить пунктирную линию между фигурных скобок

    • @kolosrodoskyi
      @kolosrodoskyi 6 років тому +1

      Установить расширение Indent Guides на VS

  • @DoimaDoima
    @DoimaDoima 2 роки тому +1

    Добрый день. А если я просто сделал геттер(или сетер чтоб работать с нашими данными) к нашему указателю, зачем перегружать оператор? В чём вообще разница? Буду благодарен а ответ.

  • @izvarzone
    @izvarzone 2 роки тому +1

    Зачем нужен setlocale(LC_ALL, "ru"); ?

  • @amirbabaev7211
    @amirbabaev7211 Рік тому +1

    а как же умный указатель для освобождения памяти массива? в данном классе будет очищаться лишь первый элемент массива, так как не было применено delete[]. мне кажется, что в данном случае нужен спецификатор шаблона класса, который бы работал через шаблон, а в его деструкторе описывалось бы delete[] ptr.

    • @kayforwarr5706
      @kayforwarr5706 Рік тому

      Всё верно, но этом уроке показана общая идея, а частные случаи, вероятно, будут разобраны в следующем уроке т.к. std::unique_ptr/std::make_unique - как раз об этом.

    • @viper_0097
      @viper_0097 9 місяців тому

      Можно сделать массив умных указателей, хотя инициализировать будет трудно

  • @ДмитрийКоролев-ч8ь

    Благодарю за уроки!
    Подскажите, а где правильнее nullptr присвоить? в деструкторе SmartPointer?

  • @incay216
    @incay216 6 років тому +2

    Можешь объяснить, пожалуйста, что такое:
    DWORD, HANDLE?

    • @МаксимБеликов-ы8г
      @МаксимБеликов-ы8г 6 років тому

      Не совсем, dword - шестнадцатиричное число, а handle сам точно не помню, вроде обьект для получения доступа к другому процессу

    • @svvonline1
      @svvonline1 Рік тому

      DWORD - 32-битное беззнаковое целое. HANDLE - переопределенный тип переменной для манипулции объектом, обычно это указатель.

  • @mDwkaq
    @mDwkaq 12 днів тому

    отладчик конечнко хреновый в Visual Studio. пока все ошибки не исправишь он не запускается, подскажите аналоги, чтоб можно было пробежаться по коду, и как только он увидит ошибку в коде он ее показывал?

  • @MadRedMarx
    @MadRedMarx 4 роки тому +2

    Нехорошо одинаково именовать данные-члены класса и формальные параметры метода.

    • @svvonline1
      @svvonline1 Рік тому

      Это вопрос стиля и внимательности.

    • @MadRedMarx
      @MadRedMarx Рік тому

      @@svvonline1 Самый лучший тиль для приватных данных: Class(T var) : variable_{var) {}

  • @bleeding333
    @bleeding333 Рік тому

    А как в примере из видео получилось вывести в адрес и значение указателя, не прегружая оператор

    • @unukhtv7196
      @unukhtv7196 Рік тому

      Так он оператор * написал.

    • @bleeding333
      @bleeding333 Рік тому

      @@unukhtv7196 мне писало, что для ostream для *pointer не реализовано, пришлось писать самому

  • @libcurlcntrl
    @libcurlcntrl 6 років тому

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

    • @postdisc0
      @postdisc0 Рік тому

      да, на ту же. если посмотреть значения this и параметра ptr в режиме отладки в моменты вызова конструктора, то там видно, что this начинает указывать туда же, куда параметр

    • @libcurlcntrl
      @libcurlcntrl Рік тому +1

      @@postdisc0 за ответ спасибо, правда, за 5 лет я уже сильно отошел от плюсов )

  • @hotabmax6431
    @hotabmax6431 4 роки тому

    Получается внутри базового объекта создаётся новый, который является ссылкой на 1.

  • @5zulunder
    @5zulunder Рік тому +2

    Ваши уроки - Сокровище. Спасибо

  • @Андрей-м6г8т
    @Андрей-м6г8т 4 роки тому

    Что будет, если я объявлю указатель в стеке и создам с его помощью умный указатель из этого урока? После выхода из зоны видимости освободится и место в стеке, и сработает деструктор умного указателя?

    • @RoadToFuture007
      @RoadToFuture007 4 роки тому

      Если я Вас правильно понял и Вы хотите в стеке создать обычный указатель на умный указатель, то такой фокус наверно не выйдет: Вы стерете/потеряете просто указатель на умный указатель, а сам умный указатель (память зарезервированая за ним и его содержание) останется висеть в куче (?) Тут нужен вумный указатель на умный указатель-2, в котором будет реализована автоматическая очистка этих умных указателей-2 . Я думаю, это реализуемо.

  • @zohnannor
    @zohnannor 3 роки тому

    почему не сделать этот нью в конструкторе смарт птр? смысл же в этом вроде

  • @Ruby-ue5db
    @Ruby-ue5db 6 років тому +6

    А зачем нужно перегружать *, если мы итак получаем данные, лежащие по указателю, с помощью неперегруженной *?)

    • @kosbarable
      @kosbarable 6 років тому +1

      затем, что оператор звёздочка не определённый в декларируемом классе просто не сработает в коде, если только не сделать доступ до самого поля с обычным указателем (вынести его из private в public) и не применить оператор уже к нему)
      Но тогда встаёт вопрос об инкапсуляции)

    • @jsgaming9839
      @jsgaming9839 5 років тому

      оператор * у shared_ptr< int* > вернет **int я так понял, а нам нужен *int. Так что перегружать надо.

    • @vladportnov3041
      @vladportnov3041 5 років тому

      так как неперегруженный * дает указатель на объект, а не на наше поле ptr

  • @ДмитрийНормов-ю6ц
    @ДмитрийНормов-ю6ц 2 роки тому

    Не совсем понял момент с перегрузкой *.
    Ведь звездочка - это и так по дефолту значит "разыменование указателя"(

    • @voxel1547
      @voxel1547 Рік тому +1

      @FREENZY выделение - это new, а указатель это собственно указатель на память где хранится что-то, например выделенная память

  • @alexeypatrushev8645
    @alexeypatrushev8645 6 років тому

    А как освободить память (вызвать деструктор), если в конструкторе возникла ошибка (исключение)?

    • @alexeypatrushev8645
      @alexeypatrushev8645 6 років тому

      Спасибо за ответ. Я примерно так и предполагал, просто заострил внимание на место где может возникнуть проблема.

  • @alexgaran5339
    @alexgaran5339 3 роки тому

    Деструктор активируется при выходе из зоны видимости любой функции? Я думал только из main'а.

  • @BlackFireTop
    @BlackFireTop 8 місяців тому

    Если кто-то смотрит спустя 6 лет, как в 104 строчке объекту типа SmartPointer присваивается указатель на int?
    почему отрабатывает конструктор, а не выводится ошибка об отсутствии перегрузки оператора=?

    • @TurboGamasek228
      @TurboGamasek228 7 місяців тому

      так это стандартная операция, ты же не обьект класса присваиваешь обьекту класса

    • @BlackFireTop
      @BlackFireTop 7 місяців тому

      @@TurboGamasek228 да, не объект объекту
      Но указатель объекту
      То есть это же всё равно, что объекту присваивать число
      В любом случае, спасибо за ответ, я не думал, что оно так должно отработать🤔

    • @sleepyNovember_project
      @sleepyNovember_project 5 місяців тому +1

      ​​@@BlackFireTop просто при создании (инициализации) объекта, оператор присваивания работает вроде бы так же как и скобочки, т.е. при первом создании объекта, равно работает равносильно этой записи:
      SmartPointer pointer(new int(5));

  • @sleepyNovember_project
    @sleepyNovember_project 9 місяців тому

    Бллллл, теперь у меня первая асоциация вызываемая при упоминании C++, как думаете, какая?
    ПЕРЕГРУЗКА

  • @dragonplay1484
    @dragonplay1484 2 місяці тому

    2024

  • @ЧеченскийУголок
    @ЧеченскийУголок 4 роки тому

    19:36 понятие не имею как этот отладчик запустить....

    • @shoorikefimov6759
      @shoorikefimov6759 4 роки тому

      Для VS
      F10 или зеленая стрелка с надписью "Локальный отладчик Winows".
      Перед запуском надо поставить точку останова на интересующем участке кода.

    • @zo8349
      @zo8349 Місяць тому

      Понимаю, много времени прошло, но как вы дошли до этого урока не зная как запустить отладчик?

  • @mosdomveteran9323
    @mosdomveteran9323 6 років тому

    блин я в этом синтаксисе уже начинаю плавать.

  • @ГерманБелянский
    @ГерманБелянский 3 роки тому

    Поправьте меня если я не прав, но у вас в деструкторе написан оператор delete без []. Таким образом если мы передадим указатель на массив, то получим неправильную работу программы.

    • @gavyttop1341
      @gavyttop1341 2 роки тому +3

      [] используется для масивов не так ли?

  • @БогомоловКонстянтин

    Меня глючит или на фоне очень тихо играет мелодия с Наруто или какой-то рок?

  • @firerunnew
    @firerunnew 2 роки тому +1

    0:55 поэтому нам дали ту хуйню?)))

  • @jsgaming9839
    @jsgaming9839 5 років тому

    Уроки замечательные, воть только 3 вещи непонятно. Для структур есть свои контейнеры у которых деструкторы собственные. Нафига тогда козе баян со smart_ptr (shared_ptr). Есть try ... catch на случай охрененных ветвлений. Опять непонятно нафига козе баян. Для многопоточности свои механизмы контроля доступа к данным. Я чего-то не понимаю или smart_prt заточены под многопоточные программы. Если нет - нахрен вообще этот smart_ptr? И, кстати для функции foo( const T & value ){ return T*) класс накроется медным тазом. Перегружать надо константное разименование тоже имхо.

    • @ДмитрийНормов-ю6ц
      @ДмитрийНормов-ю6ц 2 роки тому

      просто структуры остались от С и под них приходится точит соотв. инструменты...

  • @modeckrus
    @modeckrus 5 років тому

    посиб, лучше понял qt

  • @pavelios3577
    @pavelios3577 5 років тому +2

    Благодарю за урок!

  • @miroslavklyukovsky683
    @miroslavklyukovsky683 2 роки тому +1

    Спасибо большое!

  • @anotherpain9120
    @anotherpain9120 Рік тому

    Благодарю!

  • @DD0S2
    @DD0S2 3 роки тому

    спасибо

  • @ВітяКоміссаров
    @ВітяКоміссаров 2 роки тому

    спасибо

  • @bama2619
    @bama2619 Рік тому

    спасибо