c++ 错误:free():无效下一个大小(快速):

nmpmafwu  于 2023-03-14  发布在  其他
关注(0)|答案(7)|浏览(140)

这个奇怪的错误是什么?我在Ubuntu 10.10上使用g编译C。当我运行可执行文件时,它会随机弹出(8小时内可能会弹出2次,每小时编译10次)。然而,如果我清除并重新编译,它大多数时候都会消失。

*** glibc detected *** ./emailQueue.app: free(): invalid next size (fast): 0x0000000001c40270 ***
======= Backtrace: =========
/lib/libc.so.6(+0x774b6)[0x7f490d95e4b6]
/lib/libc.so.6(cfree+0x73)[0x7f490d964c83]
./emailQueue.app[0x401f47]
/lib/libc.so.6(__libc_start_main+0xfe)[0x7f490d905d8e]
./emailQueue.app[0x401cc9]
======= Memory map: ========
00400000-0040d000 r-xp 00000000 08:01 1311132                            /home/server/Projects/email/emailQueue.app
0060d000-0060e000 r--p 0000d000 08:01 1311132                            /home/server/Projects/email/emailQueue.app
0060e000-0060f000 rw-p 0000e000 08:01 1311132                            /home/server/Projects/email/emailQueue.app
01c40000-01c82000 rw-p 00000000 00:00 0                                  [heap]
7f4908000000-7f4908021000 rw-p 00000000 00:00 0 
7f4908021000-7f490c000000 ---p 00000000 00:00 0 
7f490ce52000-7f490ce5e000 r-xp 00000000 08:01 1051251                    /lib/libnss_files-2.12.1.so
7f490ce5e000-7f490d05d000 ---p 0000c000 08:01 1051251                    /lib/libnss_files-2.12.1.so
7f490d05d000-7f490d05e000 r--p 0000b000 08:01 1051251                    /lib/libnss_files-2.12.1.so
7f490d05e000-7f490d05f000 rw-p 0000c000 08:01 1051251                    /lib/libnss_files-2.12.1.so
7f490d05f000-7f490d075000 r-xp 00000000 08:01 1048770                    /lib/libz.so.1.2.3.4
7f490d075000-7f490d275000 ---p 00016000 08:01 1048770                    /lib/libz.so.1.2.3.4
7f490d275000-7f490d276000 r--p 00016000 08:01 1048770                    /lib/libz.so.1.2.3.4
7f490d276000-7f490d277000 rw-p 00017000 08:01 1048770                    /lib/libz.so.1.2.3.4
7f490d277000-7f490d28e000 r-xp 00000000 08:01 1051248                    /lib/libnsl-2.12.1.so
7f490d28e000-7f490d48d000 ---p 00017000 08:01 1051248                    /lib/libnsl-2.12.1.so
7f490d48d000-7f490d48e000 r--p 00016000 08:01 1051248                    /lib/libnsl-2.12.1.so
7f490d48e000-7f490d48f000 rw-p 00017000 08:01 1051248                    /lib/libnsl-2.12.1.so
7f490d48f000-7f490d491000 rw-p 00000000 00:00 0 
7f490d491000-7f490d49a000 r-xp 00000000 08:01 1051244                    /lib/libcrypt-2.12.1.so
7f490d49a000-7f490d69a000 ---p 00009000 08:01 1051244                    /lib/libcrypt-2.12.1.so
7f490d69a000-7f490d69b000 r--p 00009000 08:01 1051244                    /lib/libcrypt-2.12.1.so
7f490d69b000-7f490d69c000 rw-p 0000a000 08:01 1051244                    /lib/libcrypt-2.12.1.so
7f490d69c000-7f490d6ca000 rw-p 00000000 00:00 0 
7f490d6ca000-7f490d6e2000 r-xp 00000000 08:01 1051256                    /lib/libpthread-2.12.1.so
7f490d6e2000-7f490d8e1000 ---p 00018000 08:01 1051256                    /lib/libpthread-2.12.1.so
7f490d8e1000-7f490d8e2000 r--p 00017000 08:01 1051256                    /lib/libpthread-2.12.1.so
7f490d8e2000-7f490d8e3000 rw-p 00018000 08:01 1051256                    /lib/libpthread-2.12.1.so
7f490d8e3000-7f490d8e7000 rw-p 00000000 00:00 0 
7f490d8e7000-7f490da61000 r-xp 00000000 08:01 1048743                    /lib/libc-2.12.1.so
7f490da61000-7f490dc60000 ---p 0017a000 08:01 1048743                    /lib/libc-2.12.1.so
7f490dc60000-7f490dc64000 r--p 00179000 08:01 1048743                    /lib/libc-2.12.1.so
7f490dc64000-7f490dc65000 rw-p 0017d000 08:01 1048743                    /lib/libc-2.12.1.so
7f490dc65000-7f490dc6a000 rw-p 00000000 00:00 0 
7f490dc6a000-7f490dc7f000 r-xp 00000000 08:01 1048655                    /lib/libgcc_s.so.1
7f490dc7f000-7f490de7e000 ---p 00015000 08:01 1048655                    /lib/libgcc_s.so.1
7f490de7e000-7f490de7f000 r--p 00014000 08:01 1048655                    /lib/libgcc_s.so.1
7f490de7f000-7f490de80000 rw-p 00015000 08:01 1048655                    /lib/libgcc_s.so.1
7f490de80000-7f490df02000 r-xp 00000000 08:01 1051246                    /lib/libm-2.12.1.so
7f490df02000-7f490e101000 ---p 00082000 08:01 1051246                    /lib/libm-2.12.1.so
7f490e101000-7f490e102000 r--p 00081000 08:01 1051246                    /lib/libm-2.12.1.so
7f490e102000-7f490e103000 rw-p 00082000 08:01 1051246                    /lib/libm-2.12.1.so
7f490e103000-7f490e1eb000 r-xp 00000000 08:01 4853329                    /usr/lib/libstdc++.so.6.0.14
7f490e1eb000-7f490e3ea000 ---p 000e8000 08:01 4853329                    /usr/lib/libstdc++.so.6.0.14
7f490e3ea000-7f490e3f2000 r--p 000e7000 08:01 4853329                    /usr/lib/libstdc++.so.6.0.14
7f490e3f2000-7f490e3f4000 rw-p 000ef000 08:01 4853329                    /usr/lib/libstdc++.so.6.0.14
7f490e3f4000-7f490e409000 rw-p 00000000 00:00 0 
7f490e409000-7f490e5c7000 r-xp 00000000 08:01 4851315                    /usr/lib/libmysqlclient.so.16.0.0
7f490e5c7000-7f490e7c7000 ---p 001be000 08:01 4851315                    /usr/lib/libmysqlclient.so.16.0.0
7f490e7c7000-7f490e7cc000 r--p 001be000 08:01 4851315                    /usr/lib/libmysqlclient.so.16.0.0
7f490e7cc000-7f490e816000 rw-p 001c3000 08:01 4851315                    /usr/lib/libmysqlclient.so.16.0.0
7f490e816000-7f490e817000 rw-p 00000000 00:00 0 
7f490e817000-7f490e837000 r-xp 00000000 08:01 1048597                    /lib/ld-2.12.1.so
7f490ea15000-7f490ea1c000 rw-p 00000000 00:00 0 
7f490ea33000-7f490ea37000 rw-p 00000000 00:00 0 
7f490ea37000-7f490ea38000 r--p 00020000 08:01 1048597                    /lib/ld-2.12.1.so
7f490ea38000-7f490ea39000 rw-p 00021000 08:01 1048597                    /lib/ld-2.12.1.so
7f490ea39000-7f490ea3a000 rw-p 00000000 00:00 0 
7fffb85b9000-7fffb85da000 rw-p 00000000 00:00 0                          [stack]
7fffb85ff000-7fffb8600000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted
bq9c1y66

bq9c1y661#

这意味着您有一个内存错误。您可能正在尝试free一个不是由malloc分配的指针(或者delete不是由new创建的对象),或者您可能多次尝试free/delete这样的对象。您可能正在溢出缓冲区或写入不应写入的内存,从而导致堆损坏。
任何数量的编程错误都可能导致这个问题。您需要使用调试器,进行回溯,并查看错误发生时程序正在做什么。如果失败,并且您确定在以前的某个时间点损坏了堆,则您可能会经历一些痛苦的调试(如果项目足够小,您可以逐块处理它,则调试可能不会太痛苦)。

mkh04yzy

mkh04yzy2#

我遇到了同样的问题,尽管我没有在程序中进行任何动态内存分配,但是我访问了一个向量的索引而没有为它分配内存。因此,如果情况相同,最好使用resize()分配一些内存,然后访问向量元素。

ia2d9nvy

ia2d9nvy3#

我们需要代码,但是当你尝试从一个没有分配的指针中free()内存时,这通常会弹出。

piv4azn7

piv4azn74#

如果尝试为指针数组分配空间,如

char** my_array_of_strings;  // or some array of pointers such as int** or even void**

那么在为n个指针分配空间时,你需要考虑字长(在64位系统中为8字节,在32位系统中为4字节)。2指针的大小与你的字长相同。
因此,虽然您可能希望为n个指针分配空间,但实际上需要n乘以8或4(分别用于64位或32位系统)
为避免n个8字节元素的已分配内存溢出:

my_array_of_strings = (char**) malloc( n * 8 );  // for 64-bit systems
my_array_of_strings = (char**) malloc( n * 4 );  // for 32-bit systems

这将返回一个包含n个指针的块,每个指针包含8个字节(如果使用32位系统,则为4个字节)
我注意到Linux允许你使用所有的n个指针,当你没有补偿字长的时候,但是当你试图释放内存的时候,它意识到了它的错误,它给出了一个相当糟糕的错误,而且这是一个糟糕的错误,当你溢出分配的内存的时候,很多安全问题就等着你了。

4ngedf3f

4ngedf3f5#

我遇到过这样一种情况,当有人调整数组大小时,代码绕过STL的API,不安全地写入数组。

void Logo::add(const QVector3D &v, const QVector3D &n)
{
 GLfloat *p = m_data.data() + m_count;
 *p++ = v.x();
 *p++ = v.y();
 *p++ = v.z();
 *p++ = n.x();
 *p++ = n.y();
 *p++ = n.z();
 m_count += 6;
 Q_ASSERT( m_count <= m_data.size() );
}
f8rj6qna

f8rj6qna6#

我遇到了一个类似的错误。这是一个匆忙中犯下的低级错误。整数数组没有声明size int a[],然后试图访问它。如果它在main中,C++编译器应该很容易捕捉到这样的错误。然而,由于这个特殊的int数组是在一个对象中声明的,它是在我的对象创建的同时创建的(许多对象正在创建),编译器抛出了一个free():无效的下一个大小(正常)错误。我想到了2个解释(请启发我,如果有人知道更多):1.)这导致一些随机内存被分配给它,但由于这是不可访问的,它释放了所有其他堆内存,只是试图找到这个整数。2.)它所需的内存对于一个程序来说实际上是无限的,分配这个内存是释放所有其他内存。
一个简单的:

int* a;
    class foo{ 
    foo(){
       for(i=0;i<n;i++)
           a=new int[i];
     }

解决了这个问题。但是确实花了很多时间试图调试这个问题,因为编译器无法“真正”找到错误。

mqkwyuun

mqkwyuun7#

我最近在C中遇到了同样的错误:free():下一个大小无效(快速)。
在我的例子中,我有一些类似这样的代码,其中我错误地分配了一个结构指针的大小,而不是结构:

typedef struct {
    ...
} SomeStruct;
SomeStruct *someStruct = malloc(sizeof(SomeStruct*));
...
free(someStruct);

malloc应该是:

malloc(sizeof(SomeStruct));

修复了错误,希望对其他人有帮助。

相关问题