c++ - C++:使用数组实现 MergeSort 时出错:malloc():内存损坏(快速):for
问题描述
我正在使用 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)
我已经在 an 中声明了函数OrderedList object
,并且myArray
从以下代码块中我正在排序: ( myArray
is an int*
)
OrderedList::OrderedList(int size){
theArraySize = size;
myArray = new int[size];
}
'合并排序()':
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);
}
}
这是我的“合并()”功能:
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++;
}
}
我对使用指针还是很陌生(我真的只在 c++ 之前使用过 java,所以指针对我来说仍然不是那么直观)所以我想知道我的数组声明/数组指针是否做错了什么声明?
解决方案
推荐阅读
- c# - .Net Core 3.1 WPF 使用 System.Windows.Controls.DataVisualization.Toolkit
- c++ - 我如何在编译时断言元组的第 n 个元素是某种类型的可选元素?
- python - 移动特定行(从第二行开始)
- c# - Linq 按多个元素分组并获取计数
- javascript - 为什么我的 CSS 文本缩放动画会产生“弯曲”动作,我该如何消除它?
- r - 将 SpatVector 转换为 sf 或 sp
- python - 如何更新包含具有键/值对的字典的数组?
- loopbackjs - 如何将摩根添加到 Loopback 4 RestApplication?
- javascript - 使用实时数据库向数组添加和附加值
- c - 头文件中的“...”参数是否需要包含 stdarg.h?