2012-12-12 130 views
1

如何避免以下代碼中的bad_alloc錯誤。它說ç 稱爲abort功能:如何避免bad_alloc?

terminate called after throwing an instance of 'std::bad_alloc' 
    what(): std::bad_alloc 
SIGABRT 

#include<iostream> 
#include<math.h> 
#include<conio.h> 
using namespace std; 
int main() 
{ 
    int n,p,count=0; 
    double l,t; 
    while(1) 
    { 
    cin>>n; 
    if(n==0) 
     break; 
    else 
    { 
     int * arr; 
     arr= new int[n+1]; 
     for (int i=1; i<=n; i++) 
     arr[i]=0; 
     for(int i=2;i<=n;i++){ 
     if(arr[i]==0) 
     { p=i; 
      count++; 
      for (int j=2;p*j<=n;j++) 
      { 
      arr[p*j]=1; 
      } 
     } 

     } 
     delete[] arr; 
     l=(double(n))/(log(n)); 
     t=(((count-l))/count)*100; 
     if(t<0) 
     t=(-1)*t; 
     printf("%.1lf\n",t); 
    } 
    count=0; 
    } 
    getch(); 
    return 0; 
} 
+4

購買更多ram?如果您嘗試分配的內存超過您的系統可以提供的唯一方法來避免錯誤是不分配太多的內存 – PlasmaHH

+0

哪個輸入失敗? – pmr

+1

'l'對於一個變量來說是一個不好的名字,因爲它看起來很像數字'1'。 – aschepler

回答

1

雖然可用RAM會限制你的內存可以分配的金額,你可以通過一個try {...} catch(std::bad_alloc& err) {...}塊處理該異常本身。一旦你發現了std::bad_alloc異常,在返回分配更多內存之前嘗試釋放一些內存(如果可以的話)。另外,如果你打算做一堆小的分配,你可能想要查看某種類型的內存池,因爲分配和釋放小塊內存會隨着時間的推移創建內存碎片問題,保持分配塊,但不足以使連續內存做出有效分配。通過擁有自己的游泳池,您可以通過優化小塊等的分配來更好地處理碎片問題。