Если при использовании malloc создается дамп ядра с ошибкой:
malloc(): memory corruption: ....... ***
Означает ли это, что malloc пытался выделить несвободную память? ЕСЛИ так, каковы причины этого?
Если при использовании malloc создается дамп ядра с ошибкой:
malloc(): memory corruption: ....... ***
Означает ли это, что malloc пытался выделить несвободную память? ЕСЛИ так, каковы причины этого?
Это полностью зависит от вашей реализации 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 имеет из коробки, но есть инструменты, с которыми я знаком мимоходом, такие как Valgrind и Electric Fence, которые могут помочь. Наконец, существует масса домашних библиотек отладки кучи, которые могут оказаться полезными (погуглите).
Не могли бы вы предоставить свой оператор malloc()?
Кроме того, я хотел дважды проверить, что возвращаемое значение не равно нулю?
Помимо отсутствия памяти для выделения для начала, проблемы, с которыми я столкнулся при использовании malloc()
или new
, аналогичны характеру, который вы упомянули, где на самом деле возникает поврежденная куча. Обычно я находил «интересный» код в другом месте программы, выполняющий что-то вроде memcpy() с символьным буфером, вызывающим переполнение буфера и искаженное адресное пространство.
-bn
malloc
. - person dirkgently   schedule 28.10.2009