Я работаю над реализацией сортировки слиянием в 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 ++, поэтому указатели все еще не работают это интуитивно понятно для меня) так что мне интересно, мог ли я сделать что-то не так с моими объявлениями массивов / объявлениями указателей массивов?