Сергей, я вас люблю! Очень подробно и понятно. Радует, что разбираете саму механику работы тех или иных методов/объектов/классов, а не просто говорите о их функционале!
13:52 Статическим полем нельзя реализовать такой указатель, так как в таком случае счётчик ссылок будет общий для всех указателей. Даже для тех, которые указывают на разные области памяти В остальном полезно и интересно. Спасибо
Спасибо за урок! я еще javascript знаю и теперь мне понятно как там сборщик именно под капотом работает!)( там как раз он удаляет только тогда объекты, когда на них никто не ссылается)
Насчёт статичности COUNT, если так сделать, то будет ряд проблем, лучше делать его динамическим. 1. Глобальность счетчика: Если использовать статическое поле, то это будет единый счетчик для всех shared_ptr, даже если они управляют разными объектами. Это значит, что когда вы уничтожите один shared_ptr, он уменьшит счетчик, но это может повлиять на удаление объектов, управляемых другими shared_ptr. 2. Синхронизация доступа: Так как счетчик является общим для всех shared_ptr, возникает необходимость в синхронизации доступа к нему из разных потоков. Это усложняет реализацию и снижает производительность.
СэрГей.... как я понял проблему решили также как и в при проектирований ОС, в коде ядра там тоже примитивы освобождаются когда счетчик ссылки на них становится 0
Вот только статическое поле бесполезно, ведь оно актуально для всех объектов класса. Ответ довольно очевиден, определено обычное поле count, которое по умолчанию равно 1. При каждом вызове конструктора по другому shared_ptr данный count инкрементируется. В свою очередь в деструкторе два сценария, в одном если count не равен 1 он декрементируется, в другом - производит очистку памяти.
есть очень актуальный вопрос по теме. если обьекты класса shared_ptr будут ссылаться не на одну область в памяти, а на разные, к примеру на разные динамические массивы, то каким тогда образом будет происходить очистка памяти, ведь статическое поле класса shared_ptr (с помошью которого идет подсчет созданных обьектов этого класса) будет общим для всех обьектов этого класса вне зависимости от того на какую область в памяти они указывают?
Спасибо за урок! Не понимаю почему, но указатели, ссылки и все что с ними связанно являются для меня самой сложной темой, камнем преткновения так сказать. По не сколько раз просматривал ваши уроки на эту тему и все равно не доходит как и где их использовать. Практических заданий бы. Но гугл в своем репертуаре, задания есть но они для прогерров со стажем, а для лузера увы нет. Но вам благодарность однозначно, вы стараетесь, при чем бесплатно. Лайк.
и второй вопрос, почему бы просто не реализовать в умных указателях конструктор копирования по типу который мы использовали для реализации собственного класса string, который при копировании создает указатель на новую область в памяти с точно такими же данными какие были в старом указателе?
ну как минимум это не рациональное использование памяти. Ну и как бы теряется весь смысл указателей. Тобиш работа со предельными данными из разных мест кода а не их копией.
Убрали умные указатели? Выдает ошыбку unique_ptr или shared не являюца членами std, а если не использую std::unique_ptr а просто unique_ptr то пишет что он не для етой цели декларирован, прочитал кучу документацый, в том числе microsoft везде одно и тоже и ничего не роботает.
На сколько я понял, указатели перечисленные в этом видео, автоматически уничтожаются при выходе из зоны видимости программы и не вызывают утечек памяти?
Сергей, по твоему примеру решил создать аналог Shared_ptr с использованием статической переменной. Подскажи, почему я не могу задать ее значение? Вот так не работает int SmartPointer::count = 0;
получилось только так: int SmartPointer::count = 0; Но что делать если мне потребуется другой тип данных, а определить count надо сразу(например, этот класс будет в библиотеке), а вот так не получается int SmartPointer::count = 0;
Спасибо за урок! У меня такой вопрос. Я попытался самостоятельно реализовать конструктор копирования для нашего прошлого класса умного указателя SmartPointer, но компилятор даже не обращает на него внимания, а просто присваивает указателю ссылку на первый. Что не так? В уроке #82 такой проблемы не было.
Я подразумеваю, что объект копируется полностью, с учётом того, на что они ссылаются. Вот и получается, что при копировании указателей, на одну и ту же область памяти будут ссылаться два указателя. Область памяти при этом не меняется, данные тоже, только растёт количество указателей, указывающих на это. По-моему, это похоже на правду
Это, я так понимаю, не просто static counter, а дин. массив static counter для каждого адреса в дин. памяти на которую указывает указатель. Причем, каждый из элементов массива static counter знает, указатели на какой адрес в памяти он считает. То есть 2 дин. массива: static counter и static address.
Сейчас ночь, а завтра я про это вероятнее всего забуду поэтому отвечу сейчас. Возможны неточности. Нет в реализации умных указателей статических масивов. Они там не нужны. Каждый указатель хранит адрес и количество. см. memory
@@seregasemenov8412 Я знаю, каждый shared_ptr хранит два указателя, один на объект, второй на control_block, в котором хранятся счётчики ссылок для shared и weak_ptr, а так же некоторые другие поля
Можно такой вопрос,когда мы пишем оператор перемещения для объекта, мы должны использовать reset или release для того, чтобы не вызывался деструктор два раза, но при этом объект правильно переместился?
Ничего не понятно - а если там будут другие объекты того же класса shared_pnt, под которые выделены разные области памяти? Получается класс будет считать все такие объекты а одном общем поле статик. Как он тогда поймёт, какие ссылки к каким областям памяти относятся? Надеюсь, поясните.
Наверное поздно, ну да ладно. Смотри я думаю там в классе есть static динамический двумерный массив. Первый так сказать ряд - это адрес или что-то типо того, второй - это кол-во указателей. Тогда возникает вопрос, а как деструктор понимает, что уничтожает? Вариантов много, самый простой - при создании объекта класса в переменную присваивается адрес, на который ссылается указатель, потом в деструкторе сравнивается с первым рядом массива, заходит в подходящий массив и уменьшает count, конечно можно и без двумерного массива, но так как по мне понятней
Это по типу додумайте сами, но с более-менее хорошими знаниями ООП, если не вдаваться в подробности излишние, то всё ясно и понятно. Если мне что-то не понятно, я пытаюсь это сам реализовать, так сказать прочувствовать на своей шкуре, помогает
@@ВалерийПопов-ф2м, в shared_ptr есть два указателя, один на объект, второй на класс control_block. control_block хранит счётчик ссылок(сколько shared_ptr указывают на данный объект) и ещё некоторые поля, как только у последнего shared_ptr вызывается деструктор, то он уничтожает объект. Более хорошее объяснение в книге "Эффективный и современный С++".
@@user-ye4uq5sc1j Ну давай, расскажи мне в каком это месте он хреновый, и как по твоему должен выглядеть не хреновый пересказ стандарта, учитывая что ролик называется "Изучение С++ для начинающих", а не "пересказ стандарта"
@@feewre вот именно, изучение не должно сводиться к пересказу стандарта, а хреновый он тем, что пару рах автор сказал о том, что в стандарте явно запрещено! Попытайтесь разобраться перед тем, как наезжать на меня
*Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)*
я поставил лайк )))
Спасибо! =)
Сколько уроков будет ?
Моя карьера программиста началась с твоих роликов❤simple code forever in my heart
Здорово, вы уже работайте в этой сфере! Тоже стремлюсь к этому же!
@@Крайзис777 как дела, все еще учишь?
и как успехи@@Крайзис777
Сергей, я вас люблю! Очень подробно и понятно. Радует, что разбираете саму механику работы тех или иных методов/объектов/классов, а не просто говорите о их функционале!
13:52
Статическим полем нельзя реализовать такой указатель, так как в таком случае счётчик ссылок будет общий для всех указателей. Даже для тех, которые указывают на разные области памяти
В остальном полезно и интересно. Спасибо
Статический словарь (карта) и норм.
@@Kirik516 слишком дорого
#auto_ptr #unique_ptr #shared_ptr #SimpleCode #урокипрограммирования
Урок #131, полет нормальный! Летим дальше)
Супер-урок. Всё чётко, ясно и понятно! Спасибо автору!
ооооооооооооооооооочень хорошее объяснение, спасибо вам большое за ваши труды
привет из 2023. Спасибо большое за уроки!
Потрясающий урок
теперь преоткрывается завеса того как жа на самом деле работает сборщик мусора в более современных языках програмирования
Спасибо за урок! я еще javascript знаю и теперь мне понятно как там сборщик именно под капотом работает!)( там как раз он удаляет только тогда объекты, когда на них никто не ссылается)
"там как раз он удаляет только тогда объекты, когда на них никто не ссылается" - об этом говорится в любом туториале по JS.
Супер Интересно! И доступно!Спасибо!
Хочется услышать всё-таки и про weak_ptr.
хочется загугли
Спасибо большое за урок Сергей!!! Shared_point рулит)))
Спасибо, очень структурированное и полезное видео 😊
Большое вам спасибо за уроки
Спасибо!
Очень полезный и интересный урок! Лайк от всей души! Спасибо!
Спасибо за урок.
Супер огонь))) Спасибо большое!
Насчёт статичности COUNT, если так сделать, то будет ряд проблем, лучше делать его динамическим.
1. Глобальность счетчика: Если использовать статическое поле, то это будет единый счетчик для всех shared_ptr, даже если они управляют разными объектами. Это значит, что когда вы уничтожите один shared_ptr, он уменьшит счетчик, но это может повлиять на удаление объектов, управляемых другими shared_ptr.
2. Синхронизация доступа: Так как счетчик является общим для всех shared_ptr, возникает необходимость в синхронизации доступа к нему из разных потоков. Это усложняет реализацию и снижает производительность.
Спасибо за уроки)
Спасибо за этот труд!
Пожалуйста!
Спасибо большое!
достаточно сложная тема, но объяснённая простым языком, так что спасибо!)
я Вас просто обожаю
Спасибо за урок Серега, про weak_ptr тоже интересно было бы послушать)))
Очень полезный и крутой урок, спасибо большое!!!!!
как всегда на уровне.
Спасибо за качественный контент
Спасибо за урок все просто и понятно!
Очередное спасибо за урок
Благодарю за урок!
СэрГей.... как я понял проблему решили также как и в при проектирований ОС, в коде ядра там тоже примитивы освобождаются когда счетчик ссылки на них становится 0
Вот только статическое поле бесполезно, ведь оно актуально для всех объектов класса.
Ответ довольно очевиден, определено обычное поле count, которое по умолчанию равно 1. При каждом вызове конструктора по другому shared_ptr данный count инкрементируется.
В свою очередь в деструкторе два сценария, в одном если count не равен 1 он декрементируется, в другом - производит очистку памяти.
Спасибо)
есть очень актуальный вопрос по теме. если обьекты класса shared_ptr будут ссылаться не на одну область в памяти, а на разные, к примеру на разные динамические массивы, то каким тогда образом будет происходить очистка памяти, ведь статическое поле класса shared_ptr (с помошью которого идет подсчет созданных обьектов этого класса) будет общим для всех обьектов этого класса вне зависимости от того на какую область в памяти они указывают?
а shared_ptr используется, если у тебя несколько указ. на 1 память, т.е. в твоем случае они не нужны.
Подмечено верно. Там указатель на контрольный блок. А не статическая переменная.
Хочется подробнее про кастомные deleter для умных указателей
Супер
Спасибо за урок! Не понимаю почему, но указатели, ссылки и все что с ними связанно являются для меня самой сложной темой, камнем преткновения так сказать. По не сколько раз просматривал ваши уроки на эту тему и все равно не доходит как и где их использовать. Практических заданий бы. Но гугл в своем репертуаре, задания есть но они для прогерров со стажем, а для лузера увы нет. Но вам благодарность однозначно, вы стараетесь, при чем бесплатно. Лайк.
давай объясню, если хочешь.
@@ДмитрийНормов-ю6ц если не сложно, то давай
Отличный урок спасибо .
Дякую!
спасибо
и второй вопрос, почему бы просто не реализовать в умных указателях конструктор копирования по типу который мы использовали для реализации собственного класса string, который при копировании создает указатель на новую область в памяти с точно такими же данными какие были в старом указателе?
ну как минимум это не рациональное использование памяти. Ну и как бы теряется весь смысл указателей. Тобиш работа со предельными данными из разных мест кода а не их копией.
а этот ваш шаредптр потокобезопасный? если одновременно вызовутся деконструкторы у 2х последних обьектов, то беды же начаться должны
Убрали умные указатели?
Выдает ошыбку unique_ptr или shared не являюца членами std, а если не использую std::unique_ptr а просто unique_ptr то пишет что он не для етой цели декларирован, прочитал кучу документацый, в том числе microsoft везде одно и тоже и ничего не роботает.
Прикольно. Ни разу не пользовался
автопоинтер уже был устаревшим в 2018 году. А сейчас он, похоже, умер от старости, ибо в библиотеке memory нет никакого auto_ptr (или vs его не видит)
На сколько я понял, указатели перечисленные в этом видео, автоматически уничтожаются при выходе из зоны видимости программы и не вызывают утечек памяти?
3:52 popit-ка
Здраствуйте, я хотел спросить, а когда вы закончите курс "C++ для начинающих", то вы скажите что дальше учить и в какой области развиваться ?
в тему этого вопроса хотел так же спросить, на сколько еще уроков рассчитан этот курс? (извиняюсь заранее, если это уже где то обсуждалось)
О планах на будущее я рассказывал недавно в последних ответах на вопросы th-cam.com/video/EQdq3XxoJQQ/w-d-xo.html
это видео не доступно для просмотра, там отображается серый восклицательный знак в кружочке,
Сергей, по твоему примеру решил создать аналог Shared_ptr с использованием статической переменной. Подскажи, почему я не могу задать ее значение? Вот так не работает int SmartPointer::count = 0;
получилось только так: int SmartPointer::count = 0; Но что делать если мне потребуется другой тип данных, а определить count надо сразу(например, этот класс будет в библиотеке), а вот так не получается int SmartPointer::count = 0;
Получилось как-то так
template class SmartPointer {
T* ptr;
public:
static int count;
SmartPointer(T *ptr) {
this->ptr = ptr;
count++;
cout
Спасибо за урок! У меня такой вопрос. Я попытался самостоятельно реализовать конструктор копирования для нашего прошлого класса умного указателя SmartPointer, но компилятор даже не обращает на него внимания, а просто присваивает указателю ссылку на первый. Что не так? В уроке #82 такой проблемы не было.
Связано ли это как-то именно с работой указателей или шаблонными классами?
Я подразумеваю, что объект копируется полностью, с учётом того, на что они ссылаются. Вот и получается, что при копировании указателей, на одну и ту же область памяти будут ссылаться два указателя. Область памяти при этом не меняется, данные тоже, только растёт количество указателей, указывающих на это. По-моему, это похоже на правду
*ADDUSHI BRATUHA*
Подскажите пожалуйста, а смысл тогда использовать auto_ptr?
auto_ptr был исключен из стандарта при выпуске C++17. Просто забудьте про него
У меня у одного компилятор не видит auto_pointer?
Выдает ошибку: identifier "auto_ptr" is undefined.
С с++17 убрали полностью auto_ptr
Это, я так понимаю, не просто static counter, а дин. массив static counter для каждого адреса в дин. памяти на которую указывает указатель. Причем, каждый из элементов массива static counter знает, указатели на какой адрес в памяти он считает. То есть 2 дин. массива: static counter и static address.
Не правильно понимаешь. Почитать про статические переменные. И про шаблоны классов.
@@seregasemenov8412 Причём статические переменные и шаблоны класса к массивам?)
Сейчас ночь, а завтра я про это вероятнее всего забуду поэтому отвечу сейчас. Возможны неточности.
Нет в реализации умных указателей статических масивов. Они там не нужны. Каждый указатель хранит адрес и количество. см. memory
@@seregasemenov8412 Я знаю, каждый shared_ptr хранит два указателя, один на объект, второй на control_block, в котором хранятся счётчики ссылок для shared и weak_ptr, а так же некоторые другие поля
Cколько уроков будет ?
Привет, я из будущего и говорю их около 200
@@ДмитрийКошелев-п5э как успехи?
никогда не пойму значение указателей. Я понимаю, что они указывают на область памяти, где есть объект, но зачем это?
а почему просто в деструкторе не провять ptr == nullptr?
так это будет бессмысленно в данной ситуации
Что бы я без тебя делал?
Кто-нибудь может подсказать
В каком уроке он рассказывал про защиту от дурака ?
такой вопрос почему не используете make_shared() ?
ты думаешь, что в одном уроке можно всю STL рассказать?
@@ДмитрийНормов-ю6ц было бы неплохо, да =)
А как можно проверить ссылку на принадлежность к каким либо указателям? Или такой реализации нет?
Можно такой вопрос,когда мы пишем оператор перемещения для объекта, мы должны использовать reset или release для того, чтобы не вызывался деструктор два раза, но при этом объект правильно переместился?
weak pointer бы:(
Не подскажешь где просто объяснят что это?)
if (var != nullptr)
delete var;
Это оверхед, delete nullptr не вызывает падения.
с C++17 auto_ptr убрали из стандарта.
weak_ptr please!!!!!
Ничего не понятно - а если там будут другие объекты того же класса shared_pnt, под которые выделены разные области памяти? Получается класс будет считать все такие объекты а одном общем поле статик. Как он тогда поймёт, какие ссылки к каким областям памяти относятся? Надеюсь, поясните.
Наверное поздно, ну да ладно. Смотри я думаю там в классе есть static динамический двумерный массив. Первый так сказать ряд - это адрес или что-то типо того, второй - это кол-во указателей. Тогда возникает вопрос, а как деструктор понимает, что уничтожает? Вариантов много, самый простой - при создании объекта класса в переменную присваивается адрес, на который ссылается указатель, потом в деструкторе сравнивается с первым рядом массива, заходит в подходящий массив и уменьшает count, конечно можно и без двумерного массива, но так как по мне понятней
@@ВалерийПопов-ф2м так понятно, но просто в видео это было скомкано. вообще ничего такого не говорилось.
Это по типу додумайте сами, но с более-менее хорошими знаниями ООП, если не вдаваться в подробности излишние, то всё ясно и понятно. Если мне что-то не понятно, я пытаюсь это сам реализовать, так сказать прочувствовать на своей шкуре, помогает
@@ВалерийПопов-ф2м, в shared_ptr есть два указателя, один на объект, второй на класс control_block. control_block хранит счётчик ссылок(сколько shared_ptr указывают на данный объект) и ещё некоторые поля, как только у последнего shared_ptr вызывается деструктор, то он уничтожает объект. Более хорошее объяснение в книге "Эффективный и современный С++".
кто вообще диз поставил?
я так понимаю, здесь дизы ставит Гоша Дударь. потому как, больше некому,))
как с языка снял)
Константин Яровой если так интересно, то я поставил, за хреновый пересказ стандарта
@@user-ye4uq5sc1j Ну давай, расскажи мне в каком это месте он хреновый, и как по твоему должен выглядеть не хреновый пересказ стандарта, учитывая что ролик называется "Изучение С++ для начинающих", а не "пересказ стандарта"
@@feewre вот именно, изучение не должно сводиться к пересказу стандарта, а хреновый он тем, что пару рах автор сказал о том, что в стандарте явно запрещено! Попытайтесь разобраться перед тем, как наезжать на меня
Спасибо огромное!
Спасибо!
Спасибо за урок!
Спасибо за урок.
спасибо
Спасибо!
Спасибо за урок!
спасибо
Спасибо за урок!