2017-10-25 12 views
0

こんにちは私は自分の研究のための単純なベクトルクラスを作成していました。 変数を保存するだけですLONG 私はすべてをシンプルに保ちました。私が何もビルドしていないときは、エラー/警告が返されました その後、プログラムを実行した後は動作しますが、プログラムはクラッシュします。コンソールクラッシュ終了時(ループ)結束していないエラー

コードVector.h

class Vector{ 
public: 
    Vector(); 
    void add(long i); 
    void getData(); 
private: 
    long *anArray; 
    long maxSize; 
    long position; 
    void reSize(int i); 

}。

Vector.cpp

Vector::Vector(){ 
    maxSize = 2; 
    anArray = new long[maxSize]; 
    position = 0; 
} 

void Vector::add(long i){ 
    if(position==maxSize-1) 
     reSize(maxSize * 2); 

    anArray[position] = i; 
    position++; 
} 

void Vector::reSize(int i){ 
    long *temp = new long[maxSize]; 
    for(int i =0; i<maxSize; i++) 
    { 
     temp[i] = anArray[i]; 
    } 
    delete[] anArray; 
    anArray = temp; 
} 

void Vector::getData(){ 

    for(int i = 0; i<position; i++) 
    { 
     cout << "Element" << i+1 << " : " << anArray[i] << endl; 
    } 
} 

メイン

int main() 
{ 
    Vector vecStore; 



    for(int i = 0; i < 1000; i++) 
    { 
     long a; 
     vecStore.add(a = i + 1); 
    } 

    cout << "GET DATA _________ :: " << endl; 
    vecStore.getData(); 
    return 0; 
} 

プログラムがクラッシュしないかの小さな入力データ(例えば10-20) しかし、私は100またはさらに大きなそれを変更したとき。プログラムはいつかクラッシュし、いつかはクラッシュしません。

私は間違いをしましたか?

void Vector::add(long i){ 
    if(position==maxSize-1) 
     reSize(maxSize * 2); 

    anArray[position] = i; 
    position++; 
} 

position==maxSize-1

+1

あなたは

void Vector::reSize(int newSize){ // note more descriptive name long *temp = new long[newSize]; // using new size, not old size for(int i =0; i<maxSize; i++) { temp[i] = anArray[i]; } delete[] anArray; anArray = temp; maxSize = newSize; // store new size. } 

Vectorの線に沿って何かもっと欲しいもanArrayをクリーンアップするデストラクタが必要ですが、適切にこのエラーを修正するために、ここで推奨読書のビットですreSize'が壊れています。 'for(int i = 0; i user4581301

+0

私はそれをかなり手に入れません。 –

+1

'i'をパラメータとして渡しますが、ループ内に新しい' i'を宣言します。 ** void Vector :: reSize( 'int i'){...for( 'int i = 0'; i Bauss

答えて

1

は、サイズ変更は、アレイのサイズを倍増するために呼び出されます。残念ながらreSizeが壊れています。

void Vector::reSize(int i){ 
    long *temp = new long[maxSize]; 
    for(int i =0; i<maxSize; i++) 
    { 
     temp[i] = anArray[i]; 
    } 
    delete[] anArray; 
    anArray = temp; 
} 

パラメータiは決して使用されません。これはVectorの新しいサイズにする必要がありますが、新しいアレイには前の配列と同じmaxSizeが割り当てられます。 maxSizeは変更されません。

addに戻ると、データはpositionに格納され、positionは1だけ増加します。これは、次のaddpositionmaxSizeに等しいので、配列をオーバーラン防止のためのチェックは、

if(position==maxSize-1) 

はあなたがやりたいことではないだろうとプログラムが配列の境界外書き込みに意味します。そこから、positionは大きくなり続けて、maxSizeから1を引いた値になることは決してありません。また、その点では重要ではありません。 Undefined Behaviour has already been invokedであり、Cromは何が起こるかだけを知っている。おそらく、プログラムがクラッシュした可能性があります。プログラムがクラッシュする可能性があります。おそらく、奇妙なことが起きる可能性があります。 `What is The Rule of Three?

+0

よく説明されています。削除されたポインタにUBもアクセスしていませんか?とにかくそのコードに到達するわけではありません。 – Ron

+0

@Ronになります。しかし、それは起こる見ていない。 – user4581301

+0

ありがとう、私は後でUBをさらに見ていきます。変数の名前が明らかに間違っているので、私は影のパラメータに気付かなかった。 –

関連する問題