这个问题已被多次询问,但由于我认为我的情况是我认为更具体:
我有一个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
在我分配三维数组的一行:
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_length
和my_length2
变得非常巨大!
我变得绝望了!有人知道我的问题是什么吗?
答案 0 :(得分:6)
这个问题有很多重复,令人烦恼,我找不到适合你的。
基本问题是你的程序最明确地写在malloc / free库使用的内存块跟踪信息上。
程序中的某处是一个超出界限的内存写入。
答案 1 :(得分:-1)
好的我找到了一个可能的解决方案,我一步一步地增加了我的价值观,现在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