2017-12-04 6 views
1

私はすでに私が答えを探していると言いますが、私には何が問題なのか説明してくれません。削除を理解する[+] C++

イム今では前に私はそれはいくつかのcomceptsの目的と理解を学ぶためのものであることをあなたに言わせて、このようにC++を使用しないように私に教えてC++

を学ぶ学生とイム。

最後の文でプログラムがクラッシュする。 delete [] tempVector; 私はなぜそれが起こるのか理解できませんdelete [] vector;うまく動作します。

エラー:arr.exeで遊ぶには、私はイムが間違っているのかを理解するのに役立ちますブレークポイント

をトリガしました。

ありがとうございました。

class BetterArray 
{ 
private: 

    int* vector; 
    int count; 

public: 

    BetterArray(int value); 
    BetterArray(int* vec, int size); 
    ~BetterArray(); 

    void add(int value); 

    int* getArray(); 

}; 

BetterArray::BetterArray(int value) 
{ 
    count = 1; 

    vector = new int[1]; 
    vector[0] = value; 
} 

void BetterArray::add(int value){ 

    int* tempVector = new int[count + 1]; 

    for (int i = 0; i < count; i++) 
     tempVector[i] = vector[i]; 

    tempVector[count] = value; 

    count++; 

    delete[] vector; 

    vector = tempVector; 

    delete[] tempVector; // programa crahses here. 
} 
+3

あなたが言ったところでプログラムがクラッシュするとは思わない。しかし、あなたがコピーしたばかりのデータを解放する直前に、 'delete [] tempVector;'は両方のポインタが同じ場所を指しているので 'delete [] vector;'と同じです。 – drescherjm

+3

'delete [] vector;の' vector'とは何ですか? –

+2

'vector'はどのように宣言されていますか? –

答えて

3

クラッシュオンdeleteは、多くの場合ヒープの破損の結果です。 tempVectorポインタをvectorに割り当てると、両方のポインタが同じメモリ位置を指しています。したがって、tempVectorを削除すると、vectorも削除されます。 vectorは未割り当てメモリを指すようになりました。

vectorに書き込むと仮定すると、割り当てられていないメモリに書き込むため、ヒープが破損します。この後に何が起こるかは、未定義の動作ですが、ヒープマネージャが破損を検出した場合、クラッシュすることがよくあります。

関連する問題