-4

私はC++を初めて使用し、ユーザーが配列にdoubleを入力し続けることを許可しようとしています。ユーザーが-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 に答える