2015-07-12 45 views
0

我需要您關於此代碼的幫助;儘管擁有正確的代碼,但我仍然遇到了運行時錯誤。我知道SIGABRT錯誤是由於內存過多;你們可以告訴我我的代碼出錯了嗎?如何糾正?運行時錯誤(SIGABRT)

#include<iostream> 
    #include<stdlib.h> 
    #include<string> 
    int count=0; 
    int a[1000]; 
    using namespace std; 
    void check(string *str,int p) 
    { 
     int j=0,i,k; 
     int flag=0; 
     char *first=new char[p]; 
     char *last=new char[p]; 
     for(int i=0;i<p;i++) 
     { 
      first[j]=str[i].front(); 
      last[j]=str[i].back(); 
      j++; 
     } 
     for(i=0;i<j;i++) 
      for(k=0;k<j;k++) 
      { 
      if(flag>=2) 
      { 
       a[count++]=0; 
       delete first; 
       delete last; 
       return; 
      } 
      if(first[i]==last[k]) 
       break; 
      if(k==j-1) 
       flag++; 
      } 
      if(flag>=2) 
      { 
       a[count++]=0; 
       delete first; 
       delete last; 
       return; 
      } 
      if(i==j) 
       a[count++]=1; 
       delete first; 
       delete last; 
    } 
    int main() 
    { 
     int t,p; 
     cin>>t; 
     for(int i=0;i<t;i++) 
     { 
      cin>>p; 
      string *str=new string[p]; 
      for(int i=0;i<p;i++) 
       cin>>str[i]; 
      check(str,p); 
      delete str; 
     } 
     for(int i=0;i<count;i++) 
      if(a[i]==0) 
       cout<<"\nThe door cannot be opened."; 
      else 
       cout<<"\nOrdering is possible."; 
     return 0; 
    } 
+0

SIGABRT並不專指「過度使用內存」。你的代碼相當複雜,並且完全沒有指出你用來重現問題的輸入字符串是什麼[這可能會影響你的結果是什麼] –

+0

代碼的解決方案是分離字符串的最後一個字符和第一個字符作爲輸入。然後取消所有在兩個數組中首先和最後一個常見的字符,並且如果沒有公共字符,則該標誌遞增,這將返回incase標誌爲大於2 – navroze

回答

0

我相信你的代碼中有一個主要問題。您分配數組但刪除單個指針。對於new [],應該使用delete[]而不是delete。我相信它應該解決這個錯誤。

+0

嘿,我試圖寫沒有動態分配的代碼,只是分配str [100]和第一個[100]等等,但我得到的錯誤,它或者給sigabrt sigsev – navroze

+0

你能告訴哪一行代碼你得到這個錯誤?它可以definitelly幫助 – bartop

+0

問題解決了我使用刪除[]釋放內存。感謝thr幫助欣賞it.and此代碼與codechef中的問題有關。傢伙不提供測試用例或錯誤規範它的代碼其relha痛苦調試problems.Do你知道任何網站,我可以練習正確的編碼適當的測試用例。再次感謝! – navroze