Что такое "запоминание памяти"?

Я только что пришел в этом сообщении в блоге, в котором упоминается "топающая память":

программа на С++, которая легко способна топать память     (что-то, о чем вы, наверное, даже не слышали, если бы вы были     рожденный в мире управляемого кода.)

И на самом деле я никогда не слышал об этом!

Итак, что это такое, память топает, топает память? Когда это происходит?

Ответ 1

Память "топает", когда кусок кода манипулирует памятью, не понимая, что другой фрагмент кода использует эту память в конфликте. Существует несколько распространенных способов запоминания памяти.

Один из них выделяет, скажем, 100 байт памяти, а затем сохраняет что-то за 100-м адресом. Эта память может использоваться для хранения чего-то совершенно другого. Это особенно сложно отлаживать, потому что проблема будет возникать, когда что-то пытается получить доступ к жертве, на которой есть топик, и код, который топает на нем, может быть совершенно не связан.

Другой доступ к памяти после освобождения. Память может быть выделена для другого объекта. Опять же, код, который показывает проблему, может быть связан с вновь выделенным объектом, который получил тот же адрес и не связан с кодом, вызвавшим проблему.

Ответ 2

Очень часто это переполнение буфера; в качестве примера, этот код:

char buffer[8];
buffer[8] = 'a';

будет "топать" по тому, что происходит в следующей вещи в памяти после buffer. Вообще говоря, "топание" происходит, когда память записывается непреднамеренно.

Ответ 3

Другие ответы в основном верны, но я хотел бы привести пример.

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;

Эти образцы могут привести к бесконечному циклу (или не привести), поскольку это поведение undefined.

Скорее всего переменная i в памяти сохраняется сразу после массива. Таким образом, доступ к a[10] может фактически получить доступ к i, другими словами, он может reset счетчик циклов.

Я думаю, что это хороший пример, демонстрирующий, что память "топает".