Вопрос

При использовании malloc, если он выдает дамп ядра с ошибкой:

malloc(): memory corruption: ....... ***

Означает ли это, что malloc пытался выделить память, которая не была свободна для выделения?Если да, то каковы причины этого?

Это было полезно?

Решение

Это полностью зависит от вашей реализации malloc, но обычно это означает, что в какой-то момент перед этим malloc что-то записало больше данных в буферизованный буфер, чем его размер.

Многие реализации malloc хранят некоторые свои данные встроенными в свою память, другими словами:

+--------------------------------+
|14 bytes -> Padding             | 
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+
|6 bytes -> Your data            |
+--------------------------------+
|8 bytes -> Padding              |
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+

Таким образом, если какой-то ваш код или библиотека записали 16 байтов в этот 6-байтовый буфер, он перезапишет заполнение и 2 байта внутренней информации malloc. В следующий раз, когда вы вызовете malloc, он попытается просмотреть свои данные, чтобы найти пространство, попасть в перезаписанное пространство, и это будет бессмысленным, поскольку вы перезаписали его, повредив кучу.

В зависимости от реализации такая ошибка также может быть вызвана двойным освобождением.

Другие советы

Скорее всего, это не проблема в самом malloc. Скорее, это проблема с вашим приложением, которое изменяет части кучи, которые не должны.

Если вы работаете в Linux, попробуйте использовать Valgrind , чтобы узнать, какой код уничтожает вашу кучу.

Обычная причина этого заключается в том, что вы перезаписывали данные, которые malloc () не давал вам разрешения на перезапись - либо переполнение буфера (запись за пределами заданного вами пространства), либо переполнение буфера (запись перед запуском) буфера).

Иногда это может быть вызвано освобождением указателя, который не был выделен malloc () и др., или повторным освобождением (двойным освобождением) указателя, который был выделен malloc (). Например, освобождение статического буфера - плохая идея; вы получите коррупцию.

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

Есть несколько причин, которые являются обычными причинами повреждения кучи:

  • превышение объема выделенной памяти (запись после конца выделенного блока)
  • двойное освобождение блока
  • использование указателя после его освобождения
  • и, конечно, что-то ошибочно записывается через указатель, который не имеет ничего общего с предыдущим выделением ("попадание в оперативную память" или посторонний указатель) - это общий случай, который включает в себя все вышеперечисленное.

Эти проблемы могут быть трудны для отладки, поскольку причина и следствие часто разделены временем и пространством (разные области кода).Таким образом, ошибка не будет замечена до тех пор, пока не пройдет вечность (по компьютерному времени) после выполнения ошибки, вызвавшей проблему.

Использование отладочной кучи может быть очень полезным при отладке этих проблем.Компиляторы Microsoft имеют Куча crtdebugов это включено в отладочных сборках (но может содержать дополнительные элементы конфигурации).Я не уверен, что есть в GCC из коробки, но есть инструменты, с которыми я знаком мимоходом, такие как Валгринд и Электрическое Ограждение это могло бы помочь.Наконец-то появилась тонна самодельные библиотеки отладки кучи это могло бы быть полезно (погуглите).

Не могли бы вы, пожалуйста, предоставить свое заявление malloc()?

Кроме того, я хотел дважды проверить, что возвращаемое значение не равно null?

Помимо отсутствия памяти для выделения с самого начала, проблемы, с которыми я столкнулся при использовании malloc() или new аналогичная природа, о которой вы упомянули, на самом деле является результатом поврежденной кучи.Обычно я находил какой-нибудь "интересный" код в другом месте программы, выполняющий что-то вроде memcpy() с буфером символов, вызывающим переполнение буфера и искаженное адресное пространство.

-бн

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top