У меня есть приложение от малого до среднего, которое сочетает в себе Фортран и 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 (): повреждение памяти», связаны с доступом к нераспределенной памяти, но здесь это не так поскольку сам вызов распределения вызывает ошибку.