Что такое "запоминание памяти"?
Я только что пришел в этом сообщении в блоге, в котором упоминается "топающая память":
программа на С++, которая легко способна топать память (что-то, о чем вы, наверное, даже не слышали, если бы вы были рожденный в мире управляемого кода.)
И на самом деле я никогда не слышал об этом!
Итак, что это такое, память топает, топает память? Когда это происходит?
Ответы
Ответ 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 счетчик циклов.
Я думаю, что это хороший пример, демонстрирующий, что память "топает".