Уважаемые программисты! Перед тем как закрывать дверь (присваивать указателю nullptr) не забывайте смывать (использовать delete), во избежание переполнения стока (стека).)
Спасибо Вам большое Сергей за такой донос информации.Мне нравится наглядность , глубина информации.Абстрактные примеры дают понять суть... Этот пакет видео уроков еще больше меня вдохновил изучать программирование!
Кто сейчас учится кодить на плюсах 20-ой версии, хочу сказать. Я понял, что компилятор, после оператора delete, сам затирает и значение и адрес(видимо фактически сам делает то, что показано в видео). То есть, если посмотреть через отладчик, то после вызова оператора delete, указатель не будет иметь ни значения, ни адреса в памяти, таким образом шанс ошибиться стал намного меньше. По крайней мере я так понял, сам эту штуку проверив, если я не прав или что-то не так написал, прошу поправить меня! :)
Прочитай 10 раз : Оператор delete удаляет данные, но в памяти может статься мусор. Поэтому в указатель можно записать NuLL или 0(ноль). А чтобы совсем уничтожить адрес в указателе, в указатель записывают nullptr delete pa; // удалили данные из памяти pa = nullptr; // удалили адрес в указателе, теперь указатель без адреса
Кстати да, я тоже заметил, что лишь один delete удаляет и адрес и данные .... Думал, что у меня, что-то с кодом не так, а оказалось, что это из-за более новой версии С++ (прямо как с NULL ... все же прогресс не стоит на месте) Рад что я не один с этим столкнулся )
7:52 вот тут немного непонятно: мы ведь знаем адрес на который указывает указатель, но по тому адресу нет данных(т.к как их очистили delete) и ошибка вылетела из-за того что повторно используется delete на ненулевой адрес (в отладчике проверял)
Боже, как же интересна работа с памятью, особенно, когда ты более-менее понимаешь суть. После такого хочется копаться во всём этом и продолжать учиться!
@@lstarbox3765 емае) не ожидал получить ответ на коммент, которому год, все нормально, курс видео прошел уже давно, щас практикую unreal engine 5, но с c++ работают маловато :(
После урока пошел читать статьи о nullptr, т.к остались некоторые вопросы. Какого было мое удивление, когда я увидел, что большинство авторов статей просто берут текст данного видео, даже не меняя код.
Вернулся к этому ролику с ролика по односвязным спискам (на данный момент #133) Без этого ролика застопорился тот. Добавил к каждой строке комментарий, вроде стало понятнее: //------------------------------------- int *pa = new int; *pa = 10; cout
чтоб не путать int *pa (создание указателя) и *pa (разыменование), советую писать так: вместо int **pa, писать int** pa (Текст выделен типо там звездочки, ну вы поняли)
Спасибо, решил проверить что будет если в цикле while без условия выхода выделять память под переменную типа инт, и присваивать ей 1, затем снова перевыделять новую память и снова присваивать 1 и так пока память не закончится. В итоге пк просто крашнулся и я перезапустил его
Спасибо огромное Вам!!! Материал огонь, заполнил очень много пробелов в своих знаниях=) единственное, с точки зрения уже не новечка но все ещё изучающего ооп и парадигмы, мой мозг ломается когда вы создаете динамически указатель и я пытаюсь понять зачем создавать именно динамически его и где это может пригодится, можете в кратце рассказать если это используется где то?
в прошлом уроке, автор сам подчеркнул, что данная конструкция не имеет смысла, но в качестве примера для приведённого материала, он решил взять её для более ясного объяснения
До меня вдруг дошло как работает взлом ресурсов в играх через Artmoney) Оказывается программы могут без особых усилий рыться в чужой памяти. Осталось выяснить по какому принципу можно найти память (в том числе динамическую) выделенную под конкретную программу. Надо заняться написанием собственной Artmoney, как раз опыт будет))
Ну там, насколько я понимаю, ищется область памяти со значением, например, денег твоего персонажа, и данные в этой памяти просто меняются. Я думаю, такую программу не сложно сделать, при должном опыте конечно. Если смотреть на алгоритм работы данной программы, то мы сначала вводим начальную сумму денег нашего персонажа, нам выдается куча адресов памяти, потом мы меняем это значение, тратя деньги нашего персонажа, и нам уже из этой памяти, которая выделилась изначально, выделяется та, которая принадлежит под деньги нашего персонажа
Интересно. Но надо ведь как-то обойти ошибку segmentation fault при попытке получить доступ к памяти вне нашей программы. Или получить доступ к другой программе можно?
@@Ordinary_man2049 я уже давно не пишу на C++. Но я вот спросил у бота, говорит, что можно получить доступ к памяти процесса через API самой винды. Именно так Artmoney и работает.
Здравствуйте Сергей, Спасибо за очередной полезный урок! Остался вопрос: после удаление ссылки перед затиранием адреса, адрес меняется с выделенного из динамической памяти на 0x00008123. Обязательно затирать содержимое указателя и что за адрес 0x00008123? и в функциях насколько важно затирать указатель...
я не понял, почему когда проверяем if( pa!=NULL) то выскакивает ошибка. Вроде как говорится, что мы не можем проверить все ячейки памяти, но как бы наш укзатель ведь как сказано "помнит" куда он указывает, а значит имеет так сказать вполне конкретное значение pa. почему компилятор просто не сравнит его с нулём, или ошибка выскакивает по каким-то другим причинам? Тайминг 7:55 "мы не можем перебрать все возможные адреса"/ок, так а что указатель помнит? как себя зовут то он вроде помнит) И комментируем мы как раз строчку, где он указывает на ноль. Удаляем значение переменной по адресу. Адрес указатель всё еще помнит, но когда мы этот адресс сравниваем с нулём, мы не можем перебрать все ячейки памяти. Очень уважаю автора. Но то что тут сказано, сформулировано крайне неточно. Хотелось бы пояснения.
Проблема в том, что программа пытается освободить память, которая ей уже не принадлежит. Когда очищается память, адрес указателя на становится равным 0. То есть не обязательно присваивать указателю адрес 0 или nullptr (автору стоило сказать, что NULL это еще и 0, приведенный к типу (void*). Ошибка появится при попытке работать с этим указателем (разыменовать, присвоить значение по адресу, освободить память), так как программа пытается получить доступ к памяти, который ОС резервирует под другие нужды. Поэтому надо быть аккуратным в этом плане. Вы можете просто написать int x = *(int*)(0x10); и получите ошибку, так как пытаетесь прочитать данные из недоступной памяти. Думаю, именно это автор и имел в виду, сказав, что мы не можем перебирать все адреса.
Спасибо, очень доходчиво. Скажите, пожалуйста, если я создал указатель, например char* ptr; но ещё не присвоил ему никакого значения, можно ли быть уверенным, что он равен nullptr?
Все он правильно воспринимает.NULL используется для обычных переменных, а nullptr для указателей. Это и придумано было для того чтобы при перегрузке функции, можно было их различать. Если одна функция принимает указатель, а другая с таким же именем принимает переменную.
Обновился Win 10 pro до (1909 build) и VS обновился следом до последней версии. И теперь заглянуть в чужую область памяти не получается ua-cam.com/video/aSQoBjMdp7M/v-deo.html В момент компиляции появляется сообщение "Вызвано исключение: нарушение доступа для чтения" Или у меня с настройками VS что то не то? (настройки по умолчанию)
По сути, у нас будет занята ячейка хоть и пуста? Просто программа при создании каких-либо других указателей, один из которых мог подключиться к этой, якобы освобожденной, не сможет указать на ту, якобы освобожденную ячейку?
Я думаю,что хорошо изучив С++ посмотрев все видео Сергея и прочитать хотя бы один учебник для более глубокого понимания и общего развития, можно уже понять принцип программирования и принцип работы с оперативной памятью
@@SaffronChipMCPE боюсь огорчить, даже джуном не станете. Там кроме языка программирования другие вещи требуются. Знание английского, знание фреймворков и библиотек. Тут вы только получите хорошие знания по языку, по поводу библиотек не знаю, не смотрел
@@SaffronChipMCPE мне читают курсы в институте по С и С++. Плюс, когда я начал познавать программирование, решил выбрать этот язык, потому что знал, что в институте будут ему учить и я не знал, что хочу о программирования. Если у вас есть цель, допустим стать веб разработчиком, то этот язык не для вас. Вам следует смотреть видео и читать книги по JavaScript или Python, может по еще каким-то языкам.
Стоп. Я правильно понял? То есть мы можем взять код памяти, потом удалить его из памяти, а потом пользоваться им до сих пор. Ето прикольно. Хотя я так понимаю там может быть путаница, когда ета память присваивается другому указателю.
Напрашивается вопрос. А Зачем пишут NULL, если это то же самое, что и 0? Ведь 0 писать компактнее и понятнее. Макрос заменяет в коде все NULL на 0 перед компиляцией?
@@Артём-р1ь7ф указатель может указывать на любой тип. В данном примере он указывает на тип int. И естественно оба они указывают на инт. То есть по сути мы имеем 2 указателя. Один указывает на инт, другой на этот указатель. Он тоже указывает на инт, подругому нельзя. Еще есть указатель на void. Это указатель на общий тип, который может указывать на указатель любого типа. Это все довольно замысловато, но если хочешь разобраться, скачай книгу Стивена Прата про С++ 11стандарта. Это оч хорошая книга для старта.
Понятно, крч. ПКМ по проекту свойства. Свойства конфигурации - общие. Тут ищите пункт Проверки SDL. В видео они отключены(Или их на 2017 год еще не было, я не в курсе). Со включенными программа сама не даст вам работать по этому указателю снова.
Нулем не данные обозначаются. Ноль присваивается указателю. На рабочем столе кликните правой кнопкой на ярлыке который вам больше не нужен. Выберите "свойства" и в строке "объект" удалите содержимое. Сейчас вы обнулили указатель.
Как раз и было обьяснение , что NULL по обьявлению (поуполчании #define NULL 0 ) компилятор принимает за int=0; . А ,,nullptr,, принимает точно как не int . И тогда ошибочно вызывая какую либо функцию где в параметрах нужно указывать ,,интовое ,, значение в виде переменной pa (из ролика...) компилятор укажет на ,,ошибку в указании параметра,, . В случае с NULL -- компилятор пропусти ошибочный вызов функции с уже вытертой (несуществующей) переменной pa. И представте себе , как непредсказуемо поведет себя программа с ошибочно вызванной функцией... И как долго Вам понадобится искать свою ошибку ???
Уважаемые программисты! Перед тем как закрывать дверь (присваивать указателю nullptr) не забывайте смывать (использовать delete), во избежание переполнения стока (стека).)
нет, не стека, а кучи.
За 13 минут нужной информации больше, чем за 3 часа пары в универе. Вы великолепны!!! Спасибо
Ля, жиза
#NULL #nullptr #SimpleCode #урокипрограммирования
Спасибо за уроки! Продолжайте в том же духе
Спасибо Вам большое Сергей за такой донос информации.Мне нравится наглядность , глубина информации.Абстрактные примеры дают понять суть...
Этот пакет видео уроков еще больше меня вдохновил изучать программирование!
Просто лучшие видео по C++. Все кратко ясно и понятно
Автору большой респект т. к. он здесь подготовил целую армию плюсовых ru-программеров, чего никому еще не удавалось на рус..
А она до сих пор растёт)
@@michaelivanov1605 , да;)
@@michaelivanov1605 и это "до сих пор" продолжается до сих пор...
@@funnypineapple5381 жиза,как успехи?
Вместе мы сила
Кто сейчас учится кодить на плюсах 20-ой версии, хочу сказать.
Я понял, что компилятор, после оператора delete, сам затирает и значение и адрес(видимо фактически сам делает то, что показано в видео).
То есть, если посмотреть через отладчик, то после вызова оператора delete, указатель не будет иметь ни значения, ни адреса в памяти, таким образом шанс ошибиться стал намного меньше.
По крайней мере я так понял, сам эту штуку проверив, если я не прав или что-то не так написал, прошу поправить меня! :)
Прочитай 10 раз : Оператор delete удаляет данные, но в памяти может статься мусор. Поэтому в указатель можно записать NuLL или 0(ноль). А чтобы совсем уничтожить адрес в указателе, в указатель записывают nullptr
delete pa; // удалили данные из памяти
pa = nullptr; // удалили адрес в указателе, теперь указатель без адреса
@@ДильбарМухамедова-щ3я это и так понятно, он о другом, лучше ты прочитай 10 раз что он написал
@@sleepyNovember_project, там какой-то другой адрес, не равный nullptr, разбираться нужно.
Вовремя ответил @@rizroz3955😂😂😂
Кстати да, я тоже заметил, что лишь один delete удаляет и адрес и данные .... Думал, что у меня, что-то с кодом не так, а оказалось, что это из-за более новой версии С++ (прямо как с NULL ... все же прогресс не стоит на месте) Рад что я не один с этим столкнулся )
7:52 вот тут немного непонятно:
мы ведь знаем адрес на который указывает указатель, но по тому адресу нет данных(т.к как их очистили delete)
и ошибка вылетела из-за того что повторно используется delete на ненулевой адрес (в отладчике проверял)
Боже, как же интересна работа с памятью, особенно, когда ты более-менее понимаешь суть. После такого хочется копаться во всём этом и продолжать учиться!
Мне тоже нравится работа с памятью!
@@mal1n778 как успехи?
@@lstarbox3765 емае) не ожидал получить ответ на коммент, которому год, все нормально, курс видео прошел уже давно, щас практикую unreal engine 5, но с c++ работают маловато :(
спасибо! теперь я понял. очень доступное объяснение отличия NULL от nullptr на примере перегруженной функции
Спасибо за урок, уважаемый Сергей. Вновь приступил к занятиям.
Спасибо
Очередное спасибо за урок.
Сергей, Спасибо Вам большое! Отличные уроки!
такое малое количество лайков,за такие шикарные уроки...обидно
Уважаемый Сергей ты можешь сделать рубрику где вы будете отправлять исходники с ошибками а мы будем их
исправлять
Отличная идея для лучшей практики. Перепод также отличный по этим делам. Остальные все очень поверхностно и не полностью преподносят плюсы на рус.
Могу тебе свои проекты покидать, братан))0))
@@augustvishnevsky9258 ахахахах
@@augustvishnevsky9258 а че, тема
Большое спасибо вам за урок и прекрасное пояснение, Сергей!
После урока пошел читать статьи о nullptr, т.к остались некоторые вопросы. Какого было мое удивление, когда я увидел, что большинство авторов статей просто берут текст данного видео, даже не меняя код.
Всем привет! в 2017 версии после delete, - удаляется не только значение, но и адрес
Properties -> C/C++ -> General -> SDL Checks.
Отличный урок и советы, спасибо!
Как круто подготовиться к Олимпиаде с вашими видео.
Толково объяснил. Лайк.
как можно вас поддержать ??? мотивировать дальше выпускать такие ролики ??? Ещё раз спасибо вам за такое подробное описание
там в описании ссылки
А ха ха 😂 на гиляку его
Спасибо, отличные уроки!
Спасибо за знания!
Я специально вызвал утечку памяти циклом и у меня вся оперативка забилать прога не вылетела и у меня залагал пк 👌
изваруща
Хех, а ведь можно скомпилировать в exe и кинуть комунибудь, как вирусняк)
@@Обучение-е2щ я уже это сделал
@@nello3878 коменту год уже, достиг результатов?)
@@Azantys-w6h да я его за 20 мин сделал когда психанул с другим проектом
Спасибо вам Сергей
\
Спасибо за инфу)
Вернулся к этому ролику с ролика по односвязным спискам (на данный момент #133)
Без этого ролика застопорился тот. Добавил к каждой строке комментарий, вроде стало понятнее:
//-------------------------------------
int *pa = new int;
*pa = 10;
cout
Из #133 ?!! Ого! Здравствуйте Senior Engineer
Большое спасибо !
Спасибо!
чтоб не путать int *pa (создание указателя) и *pa (разыменование), советую писать так:
вместо int **pa, писать int** pa
(Текст выделен типо там звездочки, ну вы поняли)
@@lmrbzv в новой версии автоматически так и записывается
отличный урок!
Спасибо за урок.!
Спасибо, решил проверить что будет если в цикле while без условия выхода выделять память под переменную типа инт, и присваивать ей 1, затем снова перевыделять новую память и снова присваивать 1 и так пока память не закончится. В итоге пк просто крашнулся и я перезапустил его
Спасибо!
ты красавчик! спасибо!
Спасибо!🥰
как это классно ))) спасибо вам!!!!
Спасибо большое за урок!
Возник вопрос, а когда вообще может понадобиться передавать затирание указателя в функцию (ещё и перегруженную)?
Спасибо за уроки))
Спасибо огромное Вам!!! Материал огонь, заполнил очень много пробелов в своих знаниях=) единственное, с точки зрения уже не новечка но все ещё изучающего ооп и парадигмы, мой мозг ломается когда вы создаете динамически указатель и я пытаюсь понять зачем создавать именно динамически его и где это может пригодится, можете в кратце рассказать если это используется где то?
в прошлом уроке, автор сам подчеркнул, что данная конструкция не имеет смысла, но в качестве примера для приведённого материала, он решил взять её для более ясного объяснения
Спосибооооо :333
Привет, Сергей! Как твоё кресло поживает?)
хороший контент!
До меня вдруг дошло как работает взлом ресурсов в играх через Artmoney) Оказывается программы могут без особых усилий рыться в чужой памяти. Осталось выяснить по какому принципу можно найти память (в том числе динамическую) выделенную под конкретную программу. Надо заняться написанием собственной Artmoney, как раз опыт будет))
Ну там, насколько я понимаю, ищется область памяти со значением, например, денег твоего персонажа, и данные в этой памяти просто меняются. Я думаю, такую программу не сложно сделать, при должном опыте конечно. Если смотреть на алгоритм работы данной программы, то мы сначала вводим начальную сумму денег нашего персонажа, нам выдается куча адресов памяти, потом мы меняем это значение, тратя деньги нашего персонажа, и нам уже из этой памяти, которая выделилась изначально, выделяется та, которая принадлежит под деньги нашего персонажа
Интересно. Но надо ведь как-то обойти ошибку segmentation fault при попытке получить доступ к памяти вне нашей программы. Или получить доступ к другой программе можно?
@@Ordinary_man2049 я уже давно не пишу на C++. Но я вот спросил у бота, говорит, что можно получить доступ к памяти процесса через API самой винды. Именно так Artmoney и работает.
вопрос а на каком уроке в дальнейшем будет объектно ориентированное програмирование
👍
В Dev C++ используется стандарт C++ древнее 11
Bruh. nullptr не работает.
Здравствуйте Сергей, Спасибо за очередной полезный урок! Остался вопрос: после удаление ссылки перед затиранием адреса, адрес меняется с выделенного из динамической памяти на 0x00008123. Обязательно затирать содержимое указателя и что за адрес 0x00008123? и в функциях насколько важно затирать указатель...
Разобрался в чем проблема?!
я не понял, почему когда проверяем if( pa!=NULL) то выскакивает ошибка. Вроде как говорится, что мы не можем проверить все ячейки памяти, но как бы наш укзатель ведь как сказано "помнит" куда он указывает, а значит имеет так сказать вполне конкретное значение pa. почему компилятор просто не сравнит его с нулём, или ошибка выскакивает по каким-то другим причинам?
Тайминг 7:55
"мы не можем перебрать все возможные адреса"/ок, так а что указатель помнит? как себя зовут то он вроде помнит)
И комментируем мы как раз строчку, где он указывает на ноль. Удаляем значение переменной по адресу. Адрес указатель всё еще помнит, но когда мы этот адресс сравниваем с нулём, мы не можем перебрать все ячейки памяти. Очень уважаю автора. Но то что тут сказано, сформулировано крайне неточно. Хотелось бы пояснения.
Проблема в том, что программа пытается освободить память, которая ей уже не принадлежит. Когда очищается память, адрес указателя на становится равным 0. То есть не обязательно присваивать указателю адрес 0 или nullptr (автору стоило сказать, что NULL это еще и 0, приведенный к типу (void*). Ошибка появится при попытке работать с этим указателем (разыменовать, присвоить значение по адресу, освободить память), так как программа пытается получить доступ к памяти, который ОС резервирует под другие нужды. Поэтому надо быть аккуратным в этом плане.
Вы можете просто написать int x = *(int*)(0x10); и получите ошибку, так как пытаетесь прочитать данные из недоступной памяти. Думаю, именно это автор и имел в виду, сказав, что мы не можем перебирать все адреса.
*Л. а. й. к. о. с.* за видос.
Спсб
🗽
Если Null == 0, то функция srand(time(NULL)) == srand(time(0))?
И да, лучше уроков на Ютубе нету. Пасиб тебе за старания
тоже саме подумав
перевірив srand(time(NUUL)) == srand(time(0))
@@primate472 вже знаю, але дякую)
Спасибо, очень доходчиво. Скажите, пожалуйста, если я создал указатель, например char* ptr; но ещё не присвоил ему никакого значения, можно ли быть уверенным, что он равен nullptr?
Только если переменная указателя глобальная. Если твой char* ptr локальный, то будет указывать на случайный сегмент памяти
@@putnik7945 Спасибо, теперь буду знать.
Добрый день,
как понять когда надо писать foo = nullptr?
Все он правильно воспринимает.NULL используется для обычных переменных, а nullptr для указателей.
Это и придумано было для того чтобы при перегрузке функции, можно было их различать.
Если одна функция принимает указатель, а другая с таким же именем принимает переменную.
А можно выделять область ОП, в которой будет ссылка или указатель на другую область ОП и так по цепочке?
можно ли к вам как-то обращаться за помощью или консультацией ??
Смотрю на комментаторов из Вузов и понимаю что не зря на вышку не пошел, а чисто закончил колледж и занимаюсь самообразованием.
почему ноль интовый? указатель на int это же адрес и совсем не факт что он int.
6:32
а если delete ниче не чистит?? программирую в code::blocks, вот кусок кода.
int *pa = new int;
*pa = 10;
cout
Это из-за компилятора
Также, но после обнулению адреса, выводится segmentation fault, хз что это, но вроде все ок
После delete pa, адрес в указателе тоже изменяется - это что означает? Что указатель больше не хранит данный адрес?
Адрес меняется при перезапуске программы в любом случае
Обновился Win 10 pro до (1909 build) и VS обновился следом до последней версии. И теперь заглянуть в чужую область памяти не получается ua-cam.com/video/aSQoBjMdp7M/v-deo.html В момент компиляции появляется сообщение "Вызвано исключение: нарушение доступа для чтения"
Или у меня с настройками VS что то не то? (настройки по умолчанию)
4:00
8:20 ребята, домашнее задание
8:14 bandiCAM
я правильно понял, что обнуляя указатель, мы не можем после разыменовывать его?
Программа упадёт.
По сути, у нас будет занята ячейка хоть и пуста? Просто программа при создании каких-либо других указателей, один из которых мог подключиться к этой, якобы освобожденной, не сможет указать на ту, якобы освобожденную ячейку?
#SimpleCode, зачем нужно затирать указатель и обязательно ли это делать всегда?
затем, чтобы очистить память в 4бит от указателя. 4-же бит?))
все типы данных измеряются байтами) int = 4, double = 8.
Затем, чтобы твоя прога случайно не получила доступ к памяти, которую ты уже освободил под что-то другое.
Интересно, после этого плейлиста мы будем Junior или Middle разработчиками?)
Я думаю,что хорошо изучив С++ посмотрев все видео Сергея и прочитать хотя бы один учебник для более глубокого понимания и общего развития, можно уже понять принцип программирования и принцип работы с оперативной памятью
@@ДмитрийБузницкий-б3н так junior или middle?
@@SaffronChipMCPE боюсь огорчить, даже джуном не станете. Там кроме языка программирования другие вещи требуются. Знание английского, знание фреймворков и библиотек. Тут вы только получите хорошие знания по языку, по поводу библиотек не знаю, не смотрел
@@ДмитрийБузницкий-б3н ок, для чего этот язык учите?)
@@SaffronChipMCPE мне читают курсы в институте по С и С++. Плюс, когда я начал познавать программирование, решил выбрать этот язык, потому что знал, что в институте будут ему учить и я не знал, что хочу о программирования. Если у вас есть цель, допустим стать веб разработчиком, то этот язык не для вас. Вам следует смотреть видео и читать книги по JavaScript или Python, может по еще каким-то языкам.
Я так и не понял зачем это нужно и где это применяется (
Ths
В чем отличие NULL в СИ И C++?
мне кажется что 0 и NULL не одно и тоже) NULL скорее означает пустоту или ничего а 0 это уже какая не какая но мера измерения) поправте если не так
В днном случае "0" - это макрос
#define NULL 0
T.e. для программы одно и то же
С точки зрения философии вы правы, но для С++ это одно и тоже.
Стоп. Я правильно понял? То есть мы можем взять код памяти, потом удалить его из памяти, а потом пользоваться им до сих пор. Ето прикольно. Хотя я так понимаю там может быть путаница, когда ета память присваивается другому указателю.
Нельзя пользоваться, пока не присвоишь новый адрес. Segmentation fault
вы будите проводить онлайн уроки в прямом эфире
up
Напрашивается вопрос. А Зачем пишут NULL, если это то же самое, что и 0? Ведь 0 писать компактнее и понятнее. Макрос заменяет в коде все NULL на 0 перед компиляцией?
Я думаю для удобства чтения кода. Что бы понимать, что данный нолик ничего не значит и сразу его пропускать.
NULL всегда виднее. Это некоторого рода метка. Поймешь, когда будешь писать код на десятках страниц.
А что значит к примеру int* или int**?
В первом случае это указатель на инт, а во втором это указатель на указатель на инт.
@@panda9303 int** это указать на указатель. И они оба типа int?
@@Артём-р1ь7ф указатель может указывать на любой тип. В данном примере он указывает на тип int. И естественно оба они указывают на инт. То есть по сути мы имеем 2 указателя. Один указывает на инт, другой на этот указатель. Он тоже указывает на инт, подругому нельзя.
Еще есть указатель на void. Это указатель на общий тип, который может указывать на указатель любого типа. Это все довольно замысловато, но если хочешь разобраться, скачай книгу Стивена Прата про С++ 11стандарта. Это оч хорошая книга для старта.
Так цікаво, що іноді лайку ставити забуваю.
Кажется visual studio научился обходить эту проблему и теперь при попытке обратится к удаленной памяти через указатель, программа крашится.
Понятно, крч. ПКМ по проекту свойства. Свойства конфигурации - общие. Тут ищите пункт Проверки SDL. В видео они отключены(Или их на 2017 год еще не было, я не в курсе). Со включенными программа сама не даст вам работать по этому указателю снова.
В противном случаи переменная, скорее всего, будет возвращать вам адрес 00008123
@@krouvy469 Да, верно. В отладке посмотрел, адрес изменяется на 0x00008123 и ошибка)
Что такое null контакт в вотцапе?
Зачем нам надо обозначать наши данные нулём ?
Нулем не данные обозначаются. Ноль присваивается указателю. На рабочем столе кликните правой кнопкой на ярлыке который вам больше не нужен. Выберите "свойства" и в строке "объект" удалите содержимое. Сейчас вы обнулили указатель.
кек
Смотрел урок только ради того, чтобы понять, зачем ввели nullptr, чем он лучше NULL. Но об этом ни слова :-(
Как раз и было обьяснение , что NULL по обьявлению (поуполчании #define NULL 0 ) компилятор принимает за int=0; . А ,,nullptr,, принимает точно как не int . И тогда ошибочно вызывая какую либо функцию где в параметрах нужно указывать ,,интовое ,, значение в виде переменной pa (из ролика...) компилятор укажет на ,,ошибку в указании параметра,, . В случае с NULL -- компилятор пропусти ошибочный вызов функции с уже вытертой (несуществующей) переменной pa. И представте себе , как непредсказуемо поведет себя программа с ошибочно вызванной функцией... И как долго Вам понадобится искать свою ошибку ???
Спасибо 🙏
Спасибо
9:00
Спасибо
спасибо