2013-11-28 104 views
-1

我正在嘗試爲編程競賽(已結束)編寫以下程序。但是,我不斷收到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(); 
} 
} 
+4

您是否嘗試過在調試器中運行? –

+0

給定的測試用例在我的電腦上運行良好。這是我向法官提出的錯誤。它必定是一個導致它的特定測試用例,我無法自己找到它。 :(一般的原因是什麼? – user2441151

+0

SIGABRT可以來自程序內部或外部,但通常在內部,在調試器中運行,如果調用堆棧中有'abort()'函數,則表示它來自內部該程序可能是由於編程錯誤導致運行時調用'abort()'。 – Ben

回答

0

我想你會在內存中。

首先將數組大小調整爲0。否則,調整大小應該複製兩個數組中常見的內容,所以它需要先分配一個新的entrie數組,複製所有內容,然後釋放舊數組。

對於這些類型的東西,您可以在乞討中調整矢量大小以應對最大的測試案例,然後再也不會觸摸它們。