C错误:免费():无效的下一个尺寸(快速):,在OSX不同的行为C程序,Linux的(C Error

2019-10-20 18:16发布

这个问题已经被问了好几次,但因为我觉得我的情况是我想更具体:

我有一个C程序,它完美的作品我的OSX系统(过于庞大复制)上。 我已经用Valgrind的测试吧,我不会错过任何的FreeS / mallocs /或写,所有的问题都解决了100%。

当我现在在外部服务器通过ssh运行程序,当我没有那么多的数据运行(见下面的代码,my_length <1000),它的工作没有任何问题。 但是,具有较大的数据集,使用Linux终端我得到这个错误:

 *** Error in `./a.out': free(): invalid next size (fast): 0x00000000016b9ed0 ***
 ======= Backtrace: =========
 /lib64/libc.so.6[0x3e50475cff]
 /lib64/libc.so.6[0x3e5047cff8]
 ./a.out[0x41083c]
 ./a.out[0x402374]
 /lib64/libc.so.6(__libc_start_main+0xf5)[0x3e50421d65]
 ./a.out[0x400e79]
 ======= Memory map: ========
  00400000-00418000 r-xp 00000000 00:4d 89038   

[...]

当我在Solaris上运行它,它抱怨:

malloc failed

在一行其中I分配一个三维阵列:

 int ***A, ***B, ***C;
 A = malloc(sizeof(int**)*2); B = malloc(sizeof(int**)*2); C = malloc(sizeof(int**)*2);
 int i;
 for (i = 0; i < 2; i++) {
    A[i] = malloc(sizeof(int*)* my_length);
    B[i] = malloc(sizeof(int*)* my_length);
    C[i] = malloc(sizeof(int*)* my_length);
    for (j = 0; j <= my_length2; j++) {
        A[i][j] = malloc(sizeof(int)* my_length2);
        B[i][j] = malloc(sizeof(int)* my_length2);
        C[i][j] = malloc(sizeof(int)* my_length2);<== malloc failed here??
    }   
}

其中my_lengthmy_length2得到真的很巨大的!

我越来越绝望! 是否有人有任何线索,我的问题可能是什么?

Answer 1:

找到了这个问题的是烦人,我无法找到适合你这么多的重复。

最根本的问题是,你的程序最肯定写在内存块跟踪信息的的malloc /自由库使用。

某处在你的程序存储器写就是出界。



Answer 2:

好吧,我发现了一个可能的解决方案,我增加了我的价值观一步一个脚印,现在的valgrind以下报告:

==3954== Invalid write of size 8
==3954==    at 0x344C1B: _platform_memmove$VARIANT$Unknown (in       /usr/lib/system/libsystem_platform.dylib)
==3954==    by 0x1C4D74: __memcpy_chk (in /usr/lib/system/libsystem_c.dylib)
==3954==    by 0x10000B2E4: my_method (delete.c:1461)
==3954==    by 0x1000025B3: main (delete.c:365)
==3954==  Address 0x1020611a0 is 16 bytes after a block of size 2,096 alloc'd
==3954==    at 0x56AA: realloc (vg_replace_malloc.c:698)
==3954==    by 0x10000B21E: my_method (delete.c:1458)
==3954==    by 0x1000025B3: main (delete.c:365)

这是代码,因为我不知道为什么会出现这样:S

if (temp_length + strlen(new_substring)
                > max_seq_lens[i]) {

            max_len[i] *= 2;
            my_array[i].name = realloc(sizeof(char)* max_seq_lens[i]); <=== 
        }
 temp_length += (some_num);

所以这里temp_length是救了我my_array的当前长度[I] .name和我试图连接一个新的字符串(new_substring),我将它们连接起来之前,我想检查,如果内存足够,我实在看不出我的错误在这里:S



文章来源: C Error: free(): invalid next size (fast):, different behaviour of C program on OSX, Linux
标签: c linux macos