2011-11-21 59 views
0

您好我正在运行的合并短,这是造成核心转储故障,出现以下错误比较功能:归并排序与比较功能 - 内核倾倒

part1 21 shortbooks.txt 
*** glibc detected *** part1: free(): invalid next size (fast): 0x0867b258 *** 
======= Backtrace: ========= 
/lib/libc.so.6[0x409fb6] 
part1[0x80489c6] 
part1[0x80487fb] 
part1[0x80487fb] 
part1[0x80487fb] 
part1[0x8048ac9] 
part1[0x8048d41] 
/lib/libc.so.6(__libc_start_main+0xe6)[0x3b1e36] 
part1[0x8048561] 
======= Memory map: ======== 
00376000-00393000 r-xp 00000000 fd:00 1311353 /lib/ld-2.13.so 
00393000-00394000 r--p 0001c000 fd:00 1311353 /lib/ld-2.13.so 
00394000-00395000 rw-p 0001d000 fd:00 1311353 /lib/ld-2.13.so 
0039b000-0051e000 r-xp 00000000 fd:00 1311360 /lib/libc-2.13.so 
0051e000-0051f000 ---p 00183000 fd:00 1311360 /lib/libc-2.13.so 
0051f000-00521000 r--p 00183000 fd:00 1311360 /lib/libc-2.13.so 
00521000-00522000 rw-p 00185000 fd:00 1311360 /lib/libc-2.13.so 
00522000-00525000 rw-p 00000000 00:00 0 
00577000-00593000 r-xp 00000000 fd:00 1345987 /lib/libgcc_s-4.5.1-20100924.so.1 
00593000-00594000 rw-p 0001b000 fd:00 1345987 /lib/libgcc_s-4.5.1-20100924.so.1 
008e6000-008e7000 r-xp 00000000 00:00 0   [vdso] 
08048000-08049000 r-xp 00000000 00:19 435651043 /home/S10/rowlanj0/COMP26120/ex7/part1 
08049000-0804a000 rw-p 00001000 00:19 435651043 /home/S10/rowlanj0/COMP26120/ex7/part1 
0867b000-0869c000 rw-p 00000000 00:00 0   [heap] 
b783b000-b783c000 rw-p 00000000 00:00 0 
b7867000-b7868000 rw-p 00000000 00:00 0 
bfb25000-bfb49000 rw-p 00000000 00:00 0   [stack] 
Aborted (core dumped) 

是任何人都可以提供建议可能是什么造成这种故障以及如何解决它?

void memcopy(B *to, B *from, int count) { 

    while (count-- > 0) *to++ = *from++ ; 

} 

void merge_sort(B* book, int n, int elementsize, int (*p_cmp_f)()) { 

B *firsthalf, *endoffirsthalf, *secondhalf, *endofsecondhalf, *resultbuffer, *p_result; 

int halfsize ; 

if (n <= 1) return ; 

halfsize = n/2 ; 

firsthalf = book ; 

secondhalf = book + halfsize * elementsize ; 

merge_sort(firsthalf, halfsize, elementsize, p_cmp_f) ; 
merge_sort(secondhalf, n - halfsize, elementsize, p_cmp_f) ; 

endoffirsthalf = secondhalf ; 

endofsecondhalf = book + n * elementsize ; 

resultbuffer = (B*) malloc(n * elementsize) ; 

p_result = resultbuffer ; 

while(firsthalf < endoffirsthalf && secondhalf < endofsecondhalf) { 

    if((*p_cmp_f)(firsthalf, secondhalf) < 0) { 

    memcopy(p_result, firsthalf, elementsize) ; 
    firsthalf += elementsize ; 

    } 

    else { 

    memcopy(p_result, secondhalf, elementsize) ; 
    secondhalf += elementsize ; 

    } 

    p_result += elementsize ; 

} 

while(firsthalf < endoffirsthalf) { 

    memcopy(p_result, firsthalf, elementsize) ; 
    firsthalf += elementsize ; 
    p_result += elementsize ; 

} 

while(secondhalf < endofsecondhalf) { 

    memcopy(p_result, secondhalf, elementsize) ; 
    secondhalf += elementsize ; 
    p_result += elementsize ; 

} 

    memcopy(book, resultbuffer, n * elementsize) ; 

    free(resultbuffer) ; 

} 

这里是要求的代码。

这里的结构和比较功能之一:

typedef struct book{ 
double rating; 
double price; 
double relevance; 
int ID; 
}B; 

和比较功能:

int comp_on_price(const void *a, const void *b) 
{ 

if ((*(B *)a).price < (*(B *)b).price) 
    return 1; 
else if ((*(B *)a).price > (*(B *)b).price) 
    return -1; 
else 
    return 0; 
} 
+1

在我看来,你试图'free()'你没有'malloc()'的指针。一些代码会有所帮助。 – drdwilcox

+0

如果使用-g进行编译并从gdb运行应用程序,并在崩溃后键入“backtrace”,则可以获得更多信息 – perreal

+0

如果您没有发布代码,我们应该如何提供帮助? – pajton

回答

2

,因为你的程序是腐败的内部堆数据结构,您收到此错误。这可能是一个难以追查的问题,因为在腐败发生后很久才能检测到问题。

一些常见的原因是:

  • 解放出来的指针两次
  • 释放该未用的malloc分配
  • 缓冲区溢出的指针:数据写入关使用malloc分配的缓冲区的任一端。

我不知道这是否是问题的根源,但我注意到了指针算术中的一些错误。

secondhalf = book + halfsize * elementsize ; 

在下面的示例中,您不需要乘以elementsize。编译器会在添加整数和指针时自动执行此操作;它会假设elementsize == sizeof(B)。如果此假设无效,则在执行加法操作之前(使用乘法)将0123'转换为(char*)。根据定义,这将始终工作于sizeof(char) == 1

如果你的程序很小,你可以尝试使用Valgrind来追踪任何问题。 Valgrind正在寻找内存问题,比如堆损坏,泄漏以及未定义变量的使用。虽然速度很慢,但对于长时间运行的程序无效。