Вообще говоря, реализации malloc
работают, получая большой кусок памяти из ОС, а затем выделяя ее биты, когда вы запрашиваете буферы. Это связано с тем, что получение памяти из ОС происходит относительно медленно.
В качестве меры безопасности ваша ОС предоставит malloc
пустую память (заполненную 0 или другим повторяющимся значением). Вы не хотели бы, чтобы один процесс мог прочитать остатки несвязанного процесса.
Однако у malloc
таких проблем нет, потому что он обслуживает только этот блок одному процессу. Неважно, видите ли вы свои собственные уходы (по крайней мере, не из POV безопасности).
Так что случилось, что вы неправильно разместили буфер и увидели его изначально пустым. Затем вы освободили его и запросили «другой» буфер, и malloc, похоже, снова передал вам ту же память, на этот раз содержащую значения, которые вы в ней оставили.
Такое «совпадение» получения одной и той же памяти дважды не является маловероятным, поскольку у malloc
есть веская причина для повторного использования недавно использованной памяти, где это возможно, - скорее всего, она находится в кеше.
Вы можете подумать, что это не имеет значения для вас, потому что обычно вы не читаете из недавно выделенной памяти. Но это важно для malloc
, потому что обычно malloc хранит свои собственные служебные данные рядом с буфером. Также может иметь значение, если с удалением памяти из кеша связаны затраты - если вас можно «обмануть», чтобы снова и снова использовать одну и ту же память, тогда это происходит меньше.