我有一个结合了Fortran和C的中小型应用程序。main是用Fortran编写的,但是有一个模块是用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时抛出的(一个基本的new调用按预期工作),抛出错误的代码行如下:
int* test = new int[n];
在这种情况下,n是n=11整数。
我不认为这个问题是由于内存不足,因为我只分配了2个小的类示例和一些基本变量,我也相信如果这是问题所在,这会抛出一个不同的错误。
不幸的是,我还没有创建一个MWE。我现在已经没有了解决这个问题的方法。什么会导致这个错误?除了找到抛出错误的行之外,如何调试它?
与“malloc()”有关的其他堆栈溢出结果:内存损坏”错误是由于访问未分配的内存造成的,但这里的情况并非如此,因为是分配调用本身引发了错误。
1条答案
按热度按时间lxkprmvk1#
内存损坏错误并不总是在错误发生的地方出现,因此gdb回溯通常对查找错误没有帮助,而应该使用内存分析/调试工具,如Valgrind。