C ++: Ошибка при реализации MergeSort с массивами: mallo c (): повреждение памяти (быстрое): для - PullRequest
0 голосов
/ 31 января 2020

Я работаю над реализацией сортировки слиянием в C ++ и получаю следующую ошибку при запуске функции MergeSort:


*** glibc detected *** ./p1: malloc(): memory corruption (fast): 0x0000000001a250d0 ***
======= Backtrace: =========
/lib64/libc.so.6[0x386ce75e5e]
/lib64/libc.so.6[0x386ce7a528]
/lib64/libc.so.6(__libc_malloc+0x5c)[0x386ce7ab1c]
/usr/lib64/libstdc++.so.6(_Znwm+0x1d)[0x343febd0cd]
/usr/lib64/libstdc++.so.6(_ZNSs4_Rep9_S_createEmmRKSaIcE+0x59)[0x343fe9c3c9]
/usr/lib64/libstdc++.so.6(_ZNSs4_Rep8_M_cloneERKSaIcEm+0x2b)[0x343fe9d19b]
/usr/lib64/libstdc++.so.6(_ZNSs7reserveEm+0x3c)[0x343fe9d5ec]
/usr/lib64/libstdc++.so.6(_ZNSs6appendERKSs+0x4f)[0x343fe9dabf]
./p1[0x403b35]
./p1[0x401ef9]
/lib64/libc.so.6(__libc_start_main+0x100)[0x386ce1ed20]
./p1[0x401879]
======= Memory map: ========
00400000-00406000 r-xp 00000000 fd:00 12322163                           /home/hmp54/p1b/p1
00605000-00606000 rw-p 00005000 fd:00 12322163                           /home/hmp54/p1b/p1
01a25000-01a46000 rw-p 00000000 00:00 0                                  [heap]
343fe00000-343fee8000 r-xp 00000000 fd:00 1062181                        /usr/lib64/libstdc++.so.6.0.13
343fee8000-34400e8000 ---p 000e8000 fd:00 1062181                        /usr/lib64/libstdc++.so.6.0.13
34400e8000-34400ef000 r--p 000e8000 fd:00 1062181                        /usr/lib64/libstdc++.so.6.0.13
34400ef000-34400f1000 rw-p 000ef000 fd:00 1062181                        /usr/lib64/libstdc++.so.6.0.13
34400f1000-3440106000 rw-p 00000000 00:00 0 
386ca00000-386ca20000 r-xp 00000000 fd:00 6815797                        /lib64/ld-2.12.so
386cc20000-386cc21000 r--p 00020000 fd:00 6815797                        /lib64/ld-2.12.so
386cc21000-386cc22000 rw-p 00021000 fd:00 6815797                        /lib64/ld-2.12.so
386cc22000-386cc23000 rw-p 00000000 00:00 0 
386ce00000-386cf8b000 r-xp 00000000 fd:00 6815808                        /lib64/libc-2.12.so
386cf8b000-386d18a000 ---p 0018b000 fd:00 6815808                        /lib64/libc-2.12.so
386d18a000-386d18e000 r--p 0018a000 fd:00 6815808                        /lib64/libc-2.12.so
386d18e000-386d190000 rw-p 0018e000 fd:00 6815808                        /lib64/libc-2.12.so
386d190000-386d194000 rw-p 00000000 00:00 0 
386d200000-386d283000 r-xp 00000000 fd:00 6816160                        /lib64/libm-2.12.so
386d283000-386d482000 ---p 00083000 fd:00 6816160                        /lib64/libm-2.12.so
386d482000-386d483000 r--p 00082000 fd:00 6816160                        /lib64/libm-2.12.so
386d483000-386d484000 rw-p 00083000 fd:00 6816160                        /lib64/libm-2.12.so
3995800000-3995816000 r-xp 00000000 fd:00 6815780                        /lib64/libgcc_s-4.4.7-20120601.so.1
3995816000-3995a15000 ---p 00016000 fd:00 6815780                        /lib64/libgcc_s-4.4.7-20120601.so.1
3995a15000-3995a16000 rw-p 00015000 fd:00 6815780                        /lib64/libgcc_s-4.4.7-20120601.so.1
7f4654000000-7f4654021000 rw-p 00000000 00:00 0 
7f4654021000-7f4658000000 ---p 00000000 00:00 0 
7f465a4d0000-7f465a4d5000 rw-p 00000000 00:00 0 
7f465a4e2000-7f465a4e5000 rw-p 00000000 00:00 0 
7ffeca062000-7ffeca077000 rw-p 00000000 00:00 0                          [stack]
7ffeca13c000-7ffeca13d000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
(OrderedList) After mergeSort: Aborted (core dumped)


Я объявил функции в OrderedList object и myArray из следующего фрагмента кода - это то, что я сортирую: (myArray - это int*)

OrderedList::OrderedList(int size){
    theArraySize = size;
    myArray = new int[size];  
}

'MergeSort ()':

void OrderedList::mergeSort(int first, int last){
    int middle; 

    if(first < last){
        int middle = ((first + last) / 2); 
        mergeSort(first, middle); 
        mergeSort(middle + 1, last);
        merge(first, middle, last); 
    }
}

Вот моя функция 'Merge ()':


void OrderedList::merge(int first, int middle, int last){
    int tempArray[last];  
    int i = first, j = middle + 1; 
    int index = first; 

    while((i <= middle) && (j <=last)){

        if(myArray[i] < myArray[j]){
            tempArray[index] = myArray[i]; 
            i++;
        } else { 
            tempArray[index] = myArray[j]; 
            j++; 
        }
        index++; 
        theTraversalCount++; 
    }


    if(i > middle){
        while(j <= last){
            tempArray[index] = myArray[j];
            j++;
            index++;  
            theTraversalCount++; 
        }
    } else{
        while(i <= middle){
            tempArray[index] = myArray[i]; 
            i++;
            index++;
            theTraversalCount++; 
        }
    }

    for(int k = first; k < index; k++){
        myArray[k] = tempArray[k];
        theTraversalCount++;  

    }
}

Я все еще новичок в использовании указателей (я действительно работал только с java до c ++, поэтому указатели все еще не работают это интуитивно понятно для меня) так что мне интересно, мог ли я сделать что-то не так с моими объявлениями массивов / объявлениями указателей массивов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...