继续增加C ++的数组大小

时间:2012-10-14 22:26:31

标签: c++ arrays

我是C ++的新手,我试图让用户继续将双打输入数组,当用户输入-1时程序停止。我的代码有效,但当12个项目添加到数组时,我得到了这些错误:

  

*** glibc检测到*** ./exercise2:双重免费或损坏(退出):0x00000000010aa070 ***
  ======= Backtrace:=========

  

中止(核心倾销)

这是我的代码:

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++;
    } 
}

2 个答案:

答案 0 :(得分: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):
}

答案 1 :(得分: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];
    }
}