-4

我是 C++ 新手,我试图让用户继续在数组中输入双精度,当用户输入 -1 时程序停止。我的代码有效,但是当将 12 个项目添加到数组中时,我收到以下错误:

*** 检测到 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++;
    } 
}
4

2 回答 2

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):
}
于 2012-10-14T22:27:58.957 回答
0

有几个问题:

1) size可以是数组中元素的数量,也可以是数组的内存大小。当前没有 a 的大小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];
    }
}
于 2012-10-14T22:46:19.413 回答