c++ 调试malloc():新建时内存损坏

np8igboo  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(295)

我有一个结合了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()”有关的其他堆栈溢出结果:内存损坏”错误是由于访问未分配的内存造成的,但这里的情况并非如此,因为是分配调用本身引发了错误。

lxkprmvk

lxkprmvk1#

内存损坏错误并不总是在错误发生的地方出现,因此gdb回溯通常对查找错误没有帮助,而应该使用内存分析/调试工具,如Valgrind

相关问题