首页 > 解决方案 > 我的代码在我的笔记本电脑上的 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 << "start\n";
        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 << "end\n";
    }
    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 << "sorted3\n";
    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 << "sorted3\n";
    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 Code 上运行良好。但在任何在线 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 循环的开头打印“start”并在循环结束时打印“end”。我的 while 循环预计会运行 4 次。对于 while 循环的第一次,它一直到循环结束,执行 'cout << "end\n"' 但不会再次启动 while 循环。谢谢

标签: c++runtime-errorsigabrt

解决方案


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

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

它应该是

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

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

此外,我不建议混合变量名称i1l1,太容易让这些混淆。


推荐阅读