Отладка mallo c (): повреждение памяти на новом - PullRequest
0 голосов
/ 28 мая 2020

У меня есть приложение от малого до среднего, которое сочетает в себе Фортран и C ++. Основная часть написана на Фортране, но один модуль - на С ++. Этот модуль возвращает указатели на объекты класса, которые хранятся в формате Fortran. Во время создания одного из этих указателей система выдает следующую ошибку:

malloc(): memory corruption

Thread 1 "bc_test" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007ffff4a60801 in __GI_abort () at abort.c:79
#2  0x00007ffff4aa9897 in __libc_message (action=action@entry=do_abort, 
    fmt=fmt@entry=0x7ffff4bd6b9a "%s\n") at ../sysdeps/posix/libc_fatal.c:181
#3  0x00007ffff4ab090a in malloc_printerr (
    str=str@entry=0x7ffff4bd4e0e "malloc(): memory corruption") at malloc.c:5350
#4  0x00007ffff4ab4994 in _int_malloc (av=av@entry=0x7ffff4e0bc40 <main_arena>, 
    bytes=bytes@entry=44) at malloc.c:3738
#5  0x00007ffff4ab72ed in __GI___libc_malloc (bytes=44) at malloc.c:3065
#6  0x00007ffff50bc298 in operator new(unsigned long) ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x0000555555578967 in My_Class::My_Class(this=0x7fffffffd4e0, n=11)
    at /home/.../my_class.cpp:20

Используя gdb, я обнаружил, что ошибка возникает во время вызова new. В частности, во время вызова new в конструкторе объекта, создаваемого с помощью new (вызов basi c new работает должным образом). Строка, вызывающая ошибку, следующая:

int* test  = new int[n];

в данном случае n - целое число с n = 11.

Я не думаю, что проблема связана с отсутствием память, поскольку на данный момент я выделил только 2 небольших экземпляра класса и несколько базовых c переменных. Я также считаю, что это привело бы к другой ошибке, если бы это была проблема.

К сожалению, мне не удалось создать MWE. У меня закончились идеи, как решить эту проблему. Что может вызвать эту ошибку? Как его можно отладить, помимо поиска строки, вызывающей ошибку?

Другие результаты переполнения стека, касающиеся ошибок «mallo c (): повреждение памяти», связаны с доступом к нераспределенной памяти, но здесь это не так поскольку сам вызов распределения вызывает ошибку.

1 Ответ

0 голосов
/ 05 июня 2020

Ошибки повреждения памяти не всегда проявляются в том месте, где была совершена ошибка. В результате трассировка gdb часто оказывается бесполезной для поиска ошибки. Вместо этого следует использовать инструмент анализа / отладки памяти, такой как Valgrind.

...