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