Я правильно понимаю, что вся разница между "умным" указателем и "неумным" лишь в том, что адрес умного хранится на стэке и по этой причине, при выходе программы из фигурных скобок, где тот был объявлен, происходит автоматический вызов его деструктора? Хотя пересмотрел ролик, но умный то создаётся оператором new -- а это опять динамическая память! Значит без вызова delete будет утечка?
Спасибо за интересную подачу материала и грамотные и понятные примеры. Побольше бы таких учителей, как вы) Уже в С++ не первый год, а все равно даже в самых первых ваших уроках и сегодня нахожу что-то новое. Надеюсь вы и дальше будете вести людей через дебри С++✌🏻
Уже что-то знаю про ООП. Примерное представление инкапсуляции, наследования, полиморфизма есть. Но чет боюсь, что в процессе изучения ООП, могу позабыть про стандартные алгоритмы.
Советую не просто ботать и не просто решать искусственные задачи на алгоритмы, но и делать pet проекты. Они тоже могут быть искусственным, особенно по началу, но быстро могут перерости в значимые и прикладные. В своём pet проекте сможешь одновременно все возможности плюсов отработать, и кучу алгоритмов написать), вопрос только, какой именно проект будешь делать. А самое главное преимущество от этого - можно будет показать свой проект при трудоустройстве, и скорее всего, это покажет вас с лучшей стороны (особенно, если будет виден прогресс с ходом времени). Ну, и советую делать проект сразу на GitHub, история коммитов подтвердит подлинность проекта.
Утечка памяти - это самое лайтовое при работе с динамической памятью, вот исключения - это ещё то мозгодолбство, как же они меня в край затрахали когда я выделял ее под объекты в моем большом проекте. Моё любимое: "Куча была повреждена" - и ты как бы такой смотришь и думаешь : "зшб" - ведь это даже от тебя не зависит
@@denden4455 Ты офигел, как можно их усвоить за три дня?! Тем более на скорости х2, когда половину слов перестаешь разбирать, это круто! Если ты за три дня не просто просмотрел, а по-настоящему усвоил темы - ты вундеркинд, снимаю шляпу)).
Вопрос. Имхо, не совсем понятен момент где pointer = new int(5). pointer является объектом класса, а new int становится полем класса. Чтобы было правильно, следовало перегрузить также оператор "=", чтобы new int присваивался именно нужному полю. Здесь происходит неявное присваивание значения полю класса средствами языка, а нужен эквивалент команды "smaprtointer pointer = smartpointer (new int(5))".
Отвечу, может кому пригодится .В данном случае new int становится полем класса через конструктор. Например запись smartpointer smartp = new int(87); Аналогична записи smartpointer smartp (new int(87)); То есть при записи smartpointer p = new int(87); сначала создается объект в правой части с помощью коструктора, потом smartp приравнивается этому объекту (это происходит с помощью оператора = по умолчанию). (но я могу и ошибаться)
Да, здесь происходит неявное преобразование типов... Если к конструктору класса добавить ключевое слово explicit, то компилятор не пропустит такой код (SmartPointer ptr = new int(5);) сообщит о не явном преобразовании. Только такой код пропустит SmartPointer ptr(new int(5);
Добрый день. А если я просто сделал геттер(или сетер чтоб работать с нашими данными) к нашему указателю, зачем перегружать оператор? В чём вообще разница? Буду благодарен а ответ.
а как же умный указатель для освобождения памяти массива? в данном классе будет очищаться лишь первый элемент массива, так как не было применено delete[]. мне кажется, что в данном случае нужен спецификатор шаблона класса, который бы работал через шаблон, а в его деструкторе описывалось бы delete[] ptr.
Всё верно, но этом уроке показана общая идея, а частные случаи, вероятно, будут разобраны в следующем уроке т.к. std::unique_ptr/std::make_unique - как раз об этом.
отладчик конечнко хреновый в Visual Studio. пока все ошибки не исправишь он не запускается, подскажите аналоги, чтоб можно было пробежаться по коду, и как только он увидит ошибку в коде он ее показывал?
Сергей, здравствуйте. Скажите пожалуйста, когда мы в функции main через оператор new возвращаем указатель на те данные, где хранится значение 5, а потом передаем их в конструктор, то куда они потом идут? Получается, когда мы присваиваем данные указателю в конструкторе, он указывает на ту же область памяти, которую мы выделили под значение 5?
да, на ту же. если посмотреть значения this и параметра ptr в режиме отладки в моменты вызова конструктора, то там видно, что this начинает указывать туда же, куда параметр
Что будет, если я объявлю указатель в стеке и создам с его помощью умный указатель из этого урока? После выхода из зоны видимости освободится и место в стеке, и сработает деструктор умного указателя?
Если я Вас правильно понял и Вы хотите в стеке создать обычный указатель на умный указатель, то такой фокус наверно не выйдет: Вы стерете/потеряете просто указатель на умный указатель, а сам умный указатель (память зарезервированая за ним и его содержание) останется висеть в куче (?) Тут нужен вумный указатель на умный указатель-2, в котором будет реализована автоматическая очистка этих умных указателей-2 . Я думаю, это реализуемо.
затем, что оператор звёздочка не определённый в декларируемом классе просто не сработает в коде, если только не сделать доступ до самого поля с обычным указателем (вынести его из private в public) и не применить оператор уже к нему) Но тогда встаёт вопрос об инкапсуляции)
Если кто-то смотрит спустя 6 лет, как в 104 строчке объекту типа SmartPointer присваивается указатель на int? почему отрабатывает конструктор, а не выводится ошибка об отсутствии перегрузки оператора=?
@@TurboGamasek228 да, не объект объекту Но указатель объекту То есть это же всё равно, что объекту присваивать число В любом случае, спасибо за ответ, я не думал, что оно так должно отработать🤔
@@BlackFireTop просто при создании (инициализации) объекта, оператор присваивания работает вроде бы так же как и скобочки, т.е. при первом создании объекта, равно работает равносильно этой записи: SmartPointer pointer(new int(5));
Поправьте меня если я не прав, но у вас в деструкторе написан оператор delete без []. Таким образом если мы передадим указатель на массив, то получим неправильную работу программы.
Уроки замечательные, воть только 3 вещи непонятно. Для структур есть свои контейнеры у которых деструкторы собственные. Нафига тогда козе баян со smart_ptr (shared_ptr). Есть try ... catch на случай охрененных ветвлений. Опять непонятно нафига козе баян. Для многопоточности свои механизмы контроля доступа к данным. Я чего-то не понимаю или smart_prt заточены под многопоточные программы. Если нет - нахрен вообще этот smart_ptr? И, кстати для функции foo( const T & value ){ return T*) класс накроется медным тазом. Перегружать надо константное разименование тоже имхо.
*Не забывайте заглядывать в описание, там много полезных ссылок!*
Я правильно понимаю, что вся разница между "умным" указателем и "неумным" лишь в том, что адрес умного хранится на стэке и по этой причине, при выходе программы из фигурных скобок, где тот был объявлен, происходит автоматический вызов его деструктора?
Хотя пересмотрел ролик, но умный то создаётся оператором new -- а это опять динамическая память! Значит без вызова delete будет утечка?
Сергей запишите, пожалуйста, видео как определять асимптотическую сложность алгоритмов.
Урок, который идёт 24 минуты, пролетел за секунду. Было очень интересно. Спасибо!
Интересно, спасибо!
#умныеуказатели #smartpointers #SimpleCode #урокипрограммирования
Smart Like!
Спасибо за интересную подачу материала и грамотные и понятные примеры. Побольше бы таких учителей, как вы) Уже в С++ не первый год, а все равно даже в самых первых ваших уроках и сегодня нахожу что-то новое. Надеюсь вы и дальше будете вести людей через дебри С++✌🏻
не первый год учишь или не первый год работаешь в С++?
не первый год учу, но до этого было очень много перерывов. Вот сейчас поступил в универ и учу каждый день, поэтому ситуация лучше
Я очень мало знаю про ООП, но почти все уроки до него я посмотрел. И понял данное видео примерно на 55%. Я рад. C++. Хочу на работу!
Уже что-то знаю про ООП. Примерное представление инкапсуляции, наследования, полиморфизма есть. Но чет боюсь, что в процессе изучения ООП, могу позабыть про стандартные алгоритмы.
@@daps9516 не забудешь, но советую раз в месяц просто пробежаться по названиям видео из плейлиста, если что то забыл пересмотреть такое видео
А я теперь изучаю Блокчейн и решаю задачи на leetcode) Ну и плюсы тоже все еще ботаю. Куда без них
Советую не просто ботать и не просто решать искусственные задачи на алгоритмы, но и делать pet проекты. Они тоже могут быть искусственным, особенно по началу, но быстро могут перерости в значимые и прикладные. В своём pet проекте сможешь одновременно все возможности плюсов отработать, и кучу алгоритмов написать), вопрос только, какой именно проект будешь делать.
А самое главное преимущество от этого - можно будет показать свой проект при трудоустройстве, и скорее всего, это покажет вас с лучшей стороны (особенно, если будет виден прогресс с ходом времени).
Ну, и советую делать проект сразу на GitHub, история коммитов подтвердит подлинность проекта.
@@randomcraft2345 и можно сделать какой-то пет проект чисто на плюсах? без qt и прочего
Спасибо большое за видеоуроки!
Это лучшее что есть в рунете. Огромное спасибо.
О да! Очень интересно! Спасибо Сергей! Браво!
Утечка памяти - это самое лайтовое при работе с динамической памятью, вот исключения - это ещё то мозгодолбство, как же они меня в край затрахали когда я выделял ее под объекты в моем большом проекте. Моё любимое: "Куча была повреждена" - и ты как бы такой смотришь и думаешь : "зшб" - ведь это даже от тебя не зависит
This is really a new word in science and technology and in programming in C++
спасибо за качественный урок.
Пожалуйста!
Спасибо за бесценный труд!)
не нарадуюсь, что нашла Сергея. А ведь все началось с запроса в гуголе про константный указатель на константу))))))
lol
балдежный урок, прекрасно объяснено!
Большое спасибо за урок!
Спасибо за урок.
Спасибо за урок
Жалко что только что нашел твой канал :( Я сейчас на четвертом твоем уроке остановился, но обязательно тебя догоню!
Уже догнал?
@@glebko732 нет все послал на х*й и бросил)
@@glebko732 а сейчас догнал?
пока посмотрел все 150 роликов. Очень сильно помогло.
putin?
Огромное спасибо!
Благодарю за урок!
Благодарю!!!
Krasavchik
спасибо за урок хочу добавить что в этом же деструкторе можно анулить сылку с помощью nullptr
привет из 2023. Спасибо большое за уроки!
Good luck to you, Sergei! Promote your channel and you in work and life, a million subscribers to the channel !!! )))
Отличный урок! Спасибо!
Не могли бы, пожалуйста, ответить на вопрос: " Когда предположительно будут Динамические структуры данных?"
Пожалуйста, в ближайшие 2 недели.
Спасибо!
Только не забудьте, что реализация шаблонных методов класса д.б. в. h файле
Thank you for the lesson!
Отличный урок! Спасибо)
Дякую!
Недавно начал изучать С++, пока что на 4 уроке. Глянул что вышел 130 урок и офигел, я же С++ буду года два где-то учить xd
Rockstar Ra-Ta Yaroslav Kastushkin За три дня дошел до этого урока на скорости x2)))))
Я за 2 месяца на обычной скорости.
Я уже год учу, но и параллельно уже работаю над своими проектами
@@denden4455 Ты офигел, как можно их усвоить за три дня?! Тем более на скорости х2, когда половину слов перестаешь разбирать, это круто! Если ты за три дня не просто просмотрел, а по-настоящему усвоил темы - ты вундеркинд, снимаю шляпу)).
ну что, выучил?)
и снова большое спасибо)
Супер спасибо.
Спасибо за качественный контент
Спасибо
Вопрос. Имхо, не совсем понятен момент где pointer = new int(5). pointer является объектом класса, а new int становится полем класса. Чтобы было правильно, следовало перегрузить также оператор "=", чтобы new int присваивался именно нужному полю. Здесь происходит неявное присваивание значения полю класса средствами языка, а нужен эквивалент команды "smaprtointer pointer = smartpointer (new int(5))".
Отвечу, может кому пригодится .В данном случае new int становится полем класса через конструктор.
Например запись
smartpointer smartp = new int(87);
Аналогична записи
smartpointer smartp (new int(87));
То есть при записи smartpointer p = new int(87); сначала создается объект в правой части с помощью коструктора, потом smartp приравнивается этому объекту (это происходит с помощью оператора = по умолчанию).
(но я могу и ошибаться)
this->ptr = ptr; это разве неявное присваивание?
Да, здесь происходит неявное преобразование типов... Если к конструктору класса добавить ключевое слово explicit, то компилятор не пропустит такой код (SmartPointer ptr = new int(5);) сообщит о не явном преобразовании. Только такой код пропустит SmartPointer ptr(new int(5);
Супер!
Отлично объясняете,Спасибо вам!
большое спасибо за отличный урок!!
очень удивляет количество лайков. лучшие уроки по плюсам на рус ютубе и вот такое...
Спасибо Сергей за урок!
В Unreal C++ gc автоматический, но только если использовать макросы UPROPERTY(), UENUM() или UFUNCTION()
Отличный урок, спасибо. Подписался)
спасибо
Темная сторона привлекла тебя, о любитель Visual Studio. Помни: тьма сгущается перед рассветом.
Спасибо)
Какой то адский урок ! )))
спасибо!
спасибо за крутой урок!
в данном случае мы можем вывести значение разименованного, то есть *pointer, как вывести адрес? то есть pointer?
не подскажете, почему не получается поместить в переменную класса SmartPointer указатель именно на МАССИВ int.
для массивов нужна своя реализация)) т.к нужно удалять не просто delete ptr, а delete [] ptr как для массива;
как включить пунктирную линию между фигурных скобок
Установить расширение Indent Guides на VS
Добрый день. А если я просто сделал геттер(или сетер чтоб работать с нашими данными) к нашему указателю, зачем перегружать оператор? В чём вообще разница? Буду благодарен а ответ.
наверно, геттер здесь не нужен...
Зачем нужен setlocale(LC_ALL, "ru"); ?
а как же умный указатель для освобождения памяти массива? в данном классе будет очищаться лишь первый элемент массива, так как не было применено delete[]. мне кажется, что в данном случае нужен спецификатор шаблона класса, который бы работал через шаблон, а в его деструкторе описывалось бы delete[] ptr.
Всё верно, но этом уроке показана общая идея, а частные случаи, вероятно, будут разобраны в следующем уроке т.к. std::unique_ptr/std::make_unique - как раз об этом.
Можно сделать массив умных указателей, хотя инициализировать будет трудно
Благодарю за уроки!
Подскажите, а где правильнее nullptr присвоить? в деструкторе SmartPointer?
в конструкторе по умолчанию
@@АртемЖуков-п7ш а почему не в деструкторе??
Можешь объяснить, пожалуйста, что такое:
DWORD, HANDLE?
Не совсем, dword - шестнадцатиричное число, а handle сам точно не помню, вроде обьект для получения доступа к другому процессу
DWORD - 32-битное беззнаковое целое. HANDLE - переопределенный тип переменной для манипулции объектом, обычно это указатель.
отладчик конечнко хреновый в Visual Studio. пока все ошибки не исправишь он не запускается, подскажите аналоги, чтоб можно было пробежаться по коду, и как только он увидит ошибку в коде он ее показывал?
Нехорошо одинаково именовать данные-члены класса и формальные параметры метода.
Это вопрос стиля и внимательности.
@@svvonline1 Самый лучший тиль для приватных данных: Class(T var) : variable_{var) {}
А как в примере из видео получилось вывести в адрес и значение указателя, не прегружая оператор
Так он оператор * написал.
@@unukhtv7196 мне писало, что для ostream для *pointer не реализовано, пришлось писать самому
Сергей, здравствуйте. Скажите пожалуйста, когда мы в функции main через оператор new возвращаем указатель на те данные, где хранится значение 5, а потом передаем их в конструктор, то куда они потом идут? Получается, когда мы присваиваем данные указателю в конструкторе, он указывает на ту же область памяти, которую мы выделили под значение 5?
да, на ту же. если посмотреть значения this и параметра ptr в режиме отладки в моменты вызова конструктора, то там видно, что this начинает указывать туда же, куда параметр
@@postdisc0 за ответ спасибо, правда, за 5 лет я уже сильно отошел от плюсов )
Получается внутри базового объекта создаётся новый, который является ссылкой на 1.
Ваши уроки - Сокровище. Спасибо
Что будет, если я объявлю указатель в стеке и создам с его помощью умный указатель из этого урока? После выхода из зоны видимости освободится и место в стеке, и сработает деструктор умного указателя?
Если я Вас правильно понял и Вы хотите в стеке создать обычный указатель на умный указатель, то такой фокус наверно не выйдет: Вы стерете/потеряете просто указатель на умный указатель, а сам умный указатель (память зарезервированая за ним и его содержание) останется висеть в куче (?) Тут нужен вумный указатель на умный указатель-2, в котором будет реализована автоматическая очистка этих умных указателей-2 . Я думаю, это реализуемо.
почему не сделать этот нью в конструкторе смарт птр? смысл же в этом вроде
А зачем нужно перегружать *, если мы итак получаем данные, лежащие по указателю, с помощью неперегруженной *?)
затем, что оператор звёздочка не определённый в декларируемом классе просто не сработает в коде, если только не сделать доступ до самого поля с обычным указателем (вынести его из private в public) и не применить оператор уже к нему)
Но тогда встаёт вопрос об инкапсуляции)
оператор * у shared_ptr< int* > вернет **int я так понял, а нам нужен *int. Так что перегружать надо.
так как неперегруженный * дает указатель на объект, а не на наше поле ptr
Не совсем понял момент с перегрузкой *.
Ведь звездочка - это и так по дефолту значит "разыменование указателя"(
@FREENZY выделение - это new, а указатель это собственно указатель на память где хранится что-то, например выделенная память
А как освободить память (вызвать деструктор), если в конструкторе возникла ошибка (исключение)?
Спасибо за ответ. Я примерно так и предполагал, просто заострил внимание на место где может возникнуть проблема.
Деструктор активируется при выходе из зоны видимости любой функции? Я думал только из main'а.
Если кто-то смотрит спустя 6 лет, как в 104 строчке объекту типа SmartPointer присваивается указатель на int?
почему отрабатывает конструктор, а не выводится ошибка об отсутствии перегрузки оператора=?
так это стандартная операция, ты же не обьект класса присваиваешь обьекту класса
@@TurboGamasek228 да, не объект объекту
Но указатель объекту
То есть это же всё равно, что объекту присваивать число
В любом случае, спасибо за ответ, я не думал, что оно так должно отработать🤔
@@BlackFireTop просто при создании (инициализации) объекта, оператор присваивания работает вроде бы так же как и скобочки, т.е. при первом создании объекта, равно работает равносильно этой записи:
SmartPointer pointer(new int(5));
Бллллл, теперь у меня первая асоциация вызываемая при упоминании C++, как думаете, какая?
ПЕРЕГРУЗКА
2024
19:36 понятие не имею как этот отладчик запустить....
Для VS
F10 или зеленая стрелка с надписью "Локальный отладчик Winows".
Перед запуском надо поставить точку останова на интересующем участке кода.
Понимаю, много времени прошло, но как вы дошли до этого урока не зная как запустить отладчик?
блин я в этом синтаксисе уже начинаю плавать.
Поправьте меня если я не прав, но у вас в деструкторе написан оператор delete без []. Таким образом если мы передадим указатель на массив, то получим неправильную работу программы.
[] используется для масивов не так ли?
Меня глючит или на фоне очень тихо играет мелодия с Наруто или какой-то рок?
тебя глючит.
0:55 поэтому нам дали ту хуйню?)))
Уроки замечательные, воть только 3 вещи непонятно. Для структур есть свои контейнеры у которых деструкторы собственные. Нафига тогда козе баян со smart_ptr (shared_ptr). Есть try ... catch на случай охрененных ветвлений. Опять непонятно нафига козе баян. Для многопоточности свои механизмы контроля доступа к данным. Я чего-то не понимаю или smart_prt заточены под многопоточные программы. Если нет - нахрен вообще этот smart_ptr? И, кстати для функции foo( const T & value ){ return T*) класс накроется медным тазом. Перегружать надо константное разименование тоже имхо.
просто структуры остались от С и под них приходится точит соотв. инструменты...
посиб, лучше понял qt
Благодарю за урок!
Спасибо большое!
Благодарю!
спасибо
спасибо
спасибо