Я только что наткнулся на это сообщение в блоге, в котором упоминается «топание памяти»:
программа на C ++, которая легко может топтать память (о чем вы, вероятно, даже не слышали, если родились в мире управляемого кода).
И вообще никогда не слышал об этом!
Итак, что это, топчание памяти, топчание памяти? Когда это происходит?
c++
c
memory
memory-management
царапина
источник
источник
Ответы:
Память «топтается», когда часть кода манипулирует памятью, не осознавая, что другой фрагмент кода использует эту память конфликтным образом. Есть несколько распространенных способов потрепать память.
Один из них выделяет, скажем, 100 байт памяти, но затем сохраняет что-то после 100-го адреса. Эта память может использоваться для хранения чего-то совершенно другого. Это особенно сложно отладить, потому что проблема возникнет, когда что-то попытается получить доступ к жертве, на которую наступили, и код, который наступил на нее, может быть совершенно не связанным.
Другой - доступ к памяти после ее освобождения. Память может быть выделена для другого объекта. Опять же, код, который показывает проблему, может быть связан с вновь выделенным объектом, который получил тот же адрес и не связан с кодом, вызвавшим проблему.
источник
Очень часто это переполнение буфера; например, этот код:
char buffer[8]; buffer[8] = 'a';
будет "топтать" все, что окажется в следующей записи в памяти после
buffer
. Вообще говоря, «топание» - это когда память записывается непреднамеренно.источник
Остальные ответы в основном правильные, но я хотел бы привести пример.
int a[10], i; for (i = 0; i < 11 ; i++) a[i] = 0;
int i, a[10]; for (i = 0; i < 11 ; i++) a[i] = 0;
Эти образцы могут привести к бесконечному циклу (а могут и не привести), потому что это неопределенное поведение.
Скорее всего, переменная
i
в памяти хранится сразу после массива. Таким образом, доступa[10]
может действительно получить доступ,i
другими словами, он может сбросить счетчик цикла.Думаю, это хороший пример, демонстрирующий "топание" памяти.
источник