Я думаю, что у вас есть проблема с вашим //.. do something with array
кодом (или даже с другим кодом), так как все остальное, что у вас есть, в порядке.
Часто повреждение области памяти обнаруживается только при освобождении памяти, поэтому, вероятно, удаление строки исправляет ее.
Но будьте уверены, арена все еще повреждена независимо от того, обнаруживаете вы ее или нет. Вам нужно это исправить.
Один из способов это может произойти, если ваши процедуры выделения памяти фактически выделяют дополнительные биты до и, возможно, после того, что вам дано. Например, если вы запрашиваете 1024 байта, то, что на самом деле может быть выделено из кучи, это 1040-байтовый блок, из которого вам дан адрес 16 th байт. Это дает менеджеру арены в начале 16 байт для хранения служебной информации (включая значение в самом начале).
Затем, когда блок удален, менеджер арены знает, что его служебное обслуживание находится в 16 байтах перед адресом, который вы пытаетесь освободить, и может проверить дозорное значение (или все дозорные на арене, или только по обе стороны от той, которую вы освобождаете - это все детали реализации), чтобы убедиться, что они неизменны. Если они были изменены, это считается повреждением.
Как я уже говорил ранее, коррупция может быть вызвана вашим //.. do something with array
кодом или он может быть где-то совершенно другим - все, что имеет значение, это то, что арена разгромлена.