Может ли доступ к данным из-за ожидаемой могилы?
blockquote>В большинстве случаев да. Вызов delete не обнуляет память.
Обратите внимание, что поведение не определено. Используя определенные компиляторы, память может быть обнулена. Когда вы вызываете delete, происходит то, что память помечена как доступная, поэтому в следующий раз, когда кто-то сделает новый , память может быть использована.
Если вы думаете об этом, это логично - когда вы сообщаете компилятору, что вас больше не интересует память (используя delete ), почему компьютер должен тратить время на его обнуление.
Если я хорошо понимаю, инструкция
mov
загрузила 32-битное представление того, что было по адресу 0x80486b2, в адрес, на который указывает указатель стека ... Правильно ли это?Нет. Инструкция
mov dword [esp], 0x80486b2
копирует непосредственное значение
0x80486B2
на адрес, на который указывает регистрESP
. Это место является первым параметром, переданным функцииscanf
.Итак, в основном мы получаем, что
mov
только что перемещает данные из памяти в другое место памяти, [. ..]No. Команда перемещает сразу 32-битное значение в ячейку памяти. Подпись команды MOV в этом случае:
MOV r/m32, imm32 Move imm32 to r/m32.
Значение
0x80486b2
записывается в адрес памяти DWORD, на который указывает регистр ESP.Команда
mov dword [esp + 0x4], eax
передает второй параметр изEAX
вscanf
.
Команда mov dword [esp], 0x80486b2
перемещает 32-битное мгновенное значение 0x80486b2 в 32-разрядную ячейку памяти, на которую указывает ESP. Если он переместил 32-битное значение при сохранении адреса 0x80486b2 в пункт назначения, он будет записан как mov dword [esp], dword [0x80486b2]
. Однако это не допустимая комбинация операндов для инструкции MOV.
Обратите внимание, что в вашей разборке используется синтаксис NASM.
scanf
ожидает, что указатель (адрес) будет первым аргументом. – Rudy Velthuis 14 July 2018 в 20:55