我的代码在VS代码或笔记本电脑上的任何其他IDE上运行良好,但在在线IDE上,它会产生SIGABRT错误



请有人帮我处理这段代码。

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
bool common(pair<int,int> a, pair<int,int>, pair<int,int>);
vector<pair<int,int> > merge(vector<pair<int,int> > a, vector<pair<int,int> > b, int l1, int l2);
vector<pair<int,int> > merge_sort(vector<pair<int,int> > a, int l);
int binarySearch(vector<pair<int,int> > arr, int l, int r, int x) ;
int main(){
int t = 0;
cin >> t;
int n = 0;
bool valid = false;
bool jd = false;
int cases = 0;
while(t-->0){
cout << "startn";
cases++;
cin >> n;
valid = true;
jd = false;
vector<pair<int,int> > vect1(n, std::make_pair(-1, -1));
vector<pair<int,int> > vect(n, std::make_pair(-1, -1));
vector<char> ass(n,' ');
vector<char> final(n, ' ');
for (int i=0;i<n;i++){
cin >> vect1[i].first;
cin >> vect1[i].second;
}
vect = merge_sort(vect1,n);
// for (int i=0;i<n;i++){
//     cout << vect[i].first << " " << vect[i].second << endl;
// }
int m =0;
for (int i=0;i<n-2;i++){
if (common(vect[i],vect[i+1],vect[i+2])){
valid = false;
break;
}
if(jd){
ass[i]='J';
}
else{
ass[i]='C';
}
jd = !jd;
m++;
}
if(jd){
ass[m] = 'J';
ass[m+1] = 'C';
}
else{
ass[m] = 'C';
ass[m+1] = 'J';
}
if (valid){
for (int i=0;i<n;i++){
int index = binarySearch(vect,0,(n-1),vect1[i].first);
final[i] = ass[index];
// cout << ass[i];
}
// cout << endl;
cout << "Case #" << cases << ": ";
for (int i=0;i<n;i++){
cout << final[i];
}
cout << endl;
}
else{
cout << "Case #" << cases << ": IMPOSSIBLE" << endl; 
}
cout << "endn";
}
return 0;
}
bool common(pair<int,int> a, pair<int,int> b, pair<int,int> c){
if (b.first<a.second){
/*common interval is b.first to min(b.second,a.second)*/
if(c.first<min(a.second,b.second)){
return true;
}
}
return false;
}
vector<pair<int,int> > merge(vector<pair<int,int> > a, vector<pair<int,int> > b, int l1, int l2){
// cout << "called1" << endl;
vector<pair<int,int> > c(l1+l2, std::make_pair(-1, -1));
int i1 = 0;
int i2 = 0;
int i3 = 0;
// cout << i1 << i2 << i3;
while(i1<l1 && i2 <l2){
if(a[i1].first<=b[i2].first){
c[i3++] = a[i1++];
}
else{
c[i3++] = b[i2++];
}
}
while (i2< l2){
c[i3++] = b[i2++];
}
while (i1<l2){
c[i3++] = a[i1++];
}
return c;
}
vector<pair<int,int> > merge_sort(vector<pair<int,int> > a, int l){
if (l==0 | l==1) return a;
vector<pair<int,int> > left(l/2, std::make_pair(-1, -1));
vector<pair<int,int> > right(l-l/2, std::make_pair(-1, -1));
for (int i=0;i<l/2;i++){
left[i] = a[i];
}
for (int i = 0;i<l-l/2;i++){
right[i] = a[i+l/2];
}
// cout << "sorted3n";
left = merge_sort(left, l/2);
right = merge_sort(right, l-l/2);
vector<pair<int,int> > sorted(l, std::make_pair(-1, -1));
sorted = merge(left,right,l/2,(l-l/2));
// cout << "sorted3n";
return sorted;
}
int binarySearch(vector<pair<int,int> > arr, int l, int r, int x){ 
if (r >= l) { 
int mid = l + (r - l) / 2; 
if (arr[mid].first == x) 
return mid; 
if (arr[mid].first > x) 
return binarySearch(arr, l, mid - 1, x); 
return binarySearch(arr, mid + 1, r, x); 
} 
cout << "[binarySearchError]" << endl;
return -1; 
}

输入是:

4
3
360 480
420 540
600 660
3
0 1440
1 3
2 4
5
99 150
1 100
100 301
2 5
150 250
2
0 720
720 1440

VS代码运行良好。但在任何在线IDE上,它都会显示以下运行时SIGABRT错误。

*** Error in `./prog': free(): invalid next size (fast): 0x000055718b7fad40 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x70bcb)[0x2b6a09886bcb]
/lib/x86_64-linux-gnu/libc.so.6(+0x76f96)[0x2b6a0988cf96]
/lib/x86_64-linux-gnu/libc.so.6(+0x7778e)[0x2b6a0988d78e]
./prog(+0x119a)[0x55718b3d319a]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x2b6a098362b1]
./prog(+0x14da)[0x55718b3d34da]
======= Memory map: ========
2b6a08b36000-2b6a08b59000 r-xp 00000000 fe:01 1705825                    /lib/x86_64-linux-gnu/ld-2.24.so
2b6a08b59000-2b6a08b5d000 rw-p 00000000 00:00 0 
2b6a08b66000-2b6a08b6b000 rw-p 00000000 00:00 0 
2b6a08d59000-2b6a08d5a000 r--p 00023000 fe:01 1705825                    /lib/x86_64-linux-gnu/ld-2.24.so
2b6a08d5a000-2b6a08d5b000 rw-p 00024000 fe:01 1705825                    /lib/x86_64-linux-gnu/ld-2.24.so
2b6a08d5b000-2b6a08d5c000 rw-p 00000000 00:00 0 
2b6a08d5c000-2b6a08ece000 r-xp 00000000 fe:01 1835225                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
2b6a08ece000-2b6a090ce000 ---p 00172000 fe:01 1835225                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
2b6a090ce000-2b6a090d8000 r--p 00172000 fe:01 1835225                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
2b6a090d8000-2b6a090da000 rw-p 0017c000 fe:01 1835225                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
2b6a090da000-2b6a090de000 rw-p 00000000 00:00 0 
2b6a090de000-2b6a091e1000 r-xp 00000000 fe:01 1705854                    /lib/x86_64-linux-gnu/libm-2.24.so
2b6a091e1000-2b6a093e0000 ---p 00103000 fe:01 1705854                    /lib/x86_64-linux-gnu/libm-2.24.so
2b6a093e0000-2b6a093e1000 r--p 00102000 fe:01 1705854                    /lib/x86_64-linux-gnu/libm-2.24.so
2b6a093e1000-2b6a093e2000 rw-p 00103000 fe:01 1705854                    /lib/x86_64-linux-gnu/libm-2.24.so
2b6a093e2000-2b6a093f8000 r-xp 00000000 fe:01 1705792                    /lib/x86_64-linux-gnu/libgcc_s.so.1
2b6a093f8000-2b6a095f7000 ---p 00016000 fe:01 1705792                    /lib/x86_64-linux-gnu/libgcc_s.so.1
2b6a095f7000-2b6a095f8000 r--p 00015000 fe:01 1705792                    /lib/x86_64-linux-gnu/libgcc_s.so.1
2b6a095f8000-2b6a095f9000 rw-p 00016000 fe:01 1705792                    /lib/x86_64-linux-gnu/libgcc_s.so.1
2b6a095f9000-2b6a09611000 r-xp 00000000 fe:01 1705811                    /lib/x86_64-linux-gnu/libpthread-2.24.so
2b6a09611000-2b6a09810000 ---p 00018000 fe:01 1705811                    /lib/x86_64-linux-gnu/libpthread-2.24.so
2b6a09810000-2b6a09811000 r--p 00017000 fe:01 1705811                    /lib/x86_64-linux-gnu/libpthread-2.24.so
2b6a09811000-2b6a09812000 rw-p 00018000 fe:01 1705811                    /lib/x86_64-linux-gnu/libpthread-2.24.so
2b6a09812000-2b6a09816000 rw-p 00000000 00:00 0 
2b6a09816000-2b6a099ab000 r-xp 00000000 fe:01 1705948                    /lib/x86_64-linux-gnu/libc-2.24.so
2b6a099ab000-2b6a09baa000 ---p 00195000 fe:01 1705948                    /lib/x86_64-linux-gnu/libc-2.24.so
2b6a09baa000-2b6a09bae000 r--p 00194000 fe:01 1705948                    /lib/x86_64-linux-gnu/libc-2.24.so
2b6a09bae000-2b6a09bb0000 rw-p 00198000 fe:01 1705948                    /lib/x86_64-linux-gnu/libc-2.24.so
2b6a09bb0000-2b6a09bb4000 rw-p 00000000 00:00 0 
2b6a0c000000-2b6a0c021000 rw-p 00000000 00:00 0 
2b6a0c021000-2b6a10000000 ---p 00000000 00:00 0 
55718b3d2000-55718b3d5000 r-xp 00000000 fe:01 2377562                    /home/P4aATu/prog
55718b5d4000-55718b5d5000 r--p 00002000 fe:01 2377562                    /home/P4aATu/prog
55718b5d5000-55718b5d6000 rw-p 00003000 fe:01 2377562                    /home/P4aATu/prog
55718b7e7000-55718b819000 rw-p 00000000 00:00 0                          [heap]
7ffc9328d000-7ffc932ae000 rw-p 00000000 00:00 0                          [stack]
7ffc93317000-7ffc93319000 r--p 00000000 00:00 0                          [vvar]
7ffc93319000-7ffc9331b000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

我找不到虫子,我被困了好几天。在我的主要功能中,我在while循环的开头打印"开始",在循环的结尾打印"结束"。我的while循环预计将运行4次。while循环的第一次,它一直到循环结束,执行'cout<lt;"end \n"',但不会再次启动while循环。感谢

错误在这里(在merge的末尾(。

while (i1<l2){
c[i3++] = a[i1++];
}

应该是

while (i1<l1){
c[i3++] = a[i1++];
}

使用调试器,我在五分钟内发现了这个错误(这也要归功于问题中的优秀信息(。是时候学习如何使用调试器了?

此外,我不建议混合使用i1l1这样的变量名,因为它们太容易混淆了。

最新更新