2012-10-14 70 views
-3

我是C++的新手,我試圖讓用戶不斷輸入雙精度數組,當用戶輸入-1時程序停止。該代碼我的作品,但在12個項目被添加到陣列我得到這些錯誤:保持增加數組大小C++

*** glibc的檢測*** ./exercise2:雙重釋放或腐敗(出):0x00000000010aa070 ***
=======回溯:=========

和:

中止(核心轉儲)

這是我的代碼:

int main(){ 
    int size=5; 
    int i=0; 
    double *numbers = new double[size]; 
    cout<<"Enter your double:"<<endl; 

    while(1){ 
    double *numbers2=new double[size]; 

    cin>>numbers[i]; 

    if(i>=size-1){ 
     size=size*2; 
     memcpy(&numbers2, &numbers, size); 
     delete[]numbers; 
    numbers=numbers2; 
    } 

    if(numbers[i]==-1){ 
     break; 
    } 
    cout<<numbers[i]; 
     i++; 
    } 
} 
+1

爲什麼你不使用'std :: vector'? – Wyzard

+1

這是一種學習練習嗎?在C++中,這樣做的適當方法是使用std :: vector或std :: list。 – ApplePie

+0

numbers2在執行memcpy時不會大於數字。 – Joe

回答

5

我建議簡化問題,使用std::vector

#include <vector> 

int main() 
{ 
    std::vector<double> numbers; 

    // get numbers and push into vector if valid 
    double x; 
    cin >> x; 
    numbers.push_back(x): 
} 
0

有幾個問題:

1)size可以是在元素的數量數組,或者它可以是數組的內存大小。目前沒有一個double的大小爲1個內存單元的架構。

2)刪除數組後,真的應該重新分配新計算的大小。否則,寫入已被刪除的內存是未定義的行爲。在這種情況下,它可能會導致不好的事情發生,比如段錯誤。

3)比較浮點值的相等性是有問題的。

我稍微改寫了代碼來解決所有這些問題。

using namespace std; 
int main() 
{ 
    int size=5; 
    double *numbers = new double[size]; 
    cout << "Enter your double:" << endl; 

    for (int i=0; ; ++i) 
    { 
     cin >> numbers[i]; 

     if (i >= size-1) 
     { 
      size *= 2; 
      double *numbers2 = new double[size]; 
      if (!numbers2) 
      { 
       cerr << "failed allocating memory" << endl; 
       exit(1); 
      } 

      memcpy (numbers2, numbers, sizeof double * (size/2)); 
      delete[] numbers; 
      numbers = numbers2; 
     } 
     // compare for -1 within epsilon of 1e-7 
     if (abs (numbers[i] + 1) <= 1e-7) 
      break; 

     cout << numbers[i]; 
    } 
}