Как избежать ошибок SIGABRT в C ++?

Я пытался написать следующую программу для соревнований по программированию (уже завершившихся). Однако я продолжаю получать ошибку SIGABRT. Я обязательно опорожняю все контейнеры перед запуском следующего тестового примера. Что я должен проверить?

Вот как я реализую код: http://discuss.codechef.com/questions/29659/lowsum-editorial

#include<stdio.h>
#include<algorithm>
#include<queue>
#include<vector>

using namespace std;

class compare
{
public:
    bool operator()(int a, int b)
    {
        return a>b;
    }
};

int main()
{
    int T,K,Q;
    vector<int> A,B,q,nsum;
    priority_queue<int, vector<int> , compare> PQ;      //min PQ
    scanf("%d",&T);

while(T--)
{
    scanf("%d %d",&K,&Q);

    A.resize(K);
    B.resize(K);
    q.resize(Q);

    for(int i= 0;i<K;++i)
        scanf("%d",&A[i]);

    for(int i=0;i<K;++i)
        scanf("%d",&B[i]);

    int max_q=0;

    for(int i=0;i<Q;++i)
    {
       scanf("%d",&q[i]);
       if(q[i]>max_q)
        max_q=q[i];
    }

    sort(A.begin(),A.end());
    sort(B.begin(),B.end());

    while(!PQ.empty())
        PQ.pop();

    int j=0;

    while(max_q > 0 && j < K)
    {
        for(int i=0;i<K;++i)
            PQ.push(A[i]+B[j]);

        max_q--;
        j++;                        //next element of B[]
    }

    while(!PQ.empty())
    {
        nsum.push_back(PQ.top());
        PQ.pop();
    }

    for(int j=0;j<Q;++j)
       printf("%d\n",nsum[q[j]-1]);

    nsum.clear();
}
}

person user2441151    schedule 28.11.2013    source источник
comment
Вы пробовали запускать отладчик?   -  person Some programmer dude    schedule 28.11.2013
comment
Данный тестовый пример отлично работает на моем ПК. Когда я подчиняюсь судье, я получаю ошибку. Это должен быть определенный тестовый пример, который вызывает это, и я не могу найти его самостоятельно. :( Каковы общие причины?   -  person user2441151    schedule 28.11.2013
comment
SIGABRT может поступать изнутри или вне программы, но обычно изнутри. Запустите его в отладчике. Если функция abort() находится в стеке вызовов, это означает, что она исходит из программы, вероятно, из-за ошибки программирования, в результате которой среда выполнения вызывает abort().   -  person Ben    schedule 28.11.2013
comment
Опубликуйте трассировку стека проблемы (или запустите valgrind). Не тратьте время на то, чтобы просить нас спекулировать или отлаживать ваш код, переходите сразу к номеру строки с проблемой.   -  person Nicholas Wilson    schedule 28.11.2013


Ответы (1)


Я думаю, вы переборщили с памятью.

Сначала измените размер массивов до 0. В противном случае предполагается, что изменение размера копирует содержимое, которое является общим для двух массивов, поэтому сначала нужно выделить новый массив Entrie, скопировать все, а затем освободить старый.

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

person Sorin    schedule 28.11.2013