0

私のプログラムがなぜsegであるのか不明です。 Visual Studio 2015コンパイラを使用して実行するたびにエラーが発生しますが、GNUコンパイラを使用して正常にコンパイルできます。誰でもこの問題についての洞察を提供できますか? ダイナミックメモリ(_CrtIsValidHeapPointer)に関する問題

この

は通常EVector.hというファイルに含まれますが、私はそれが

#include<iostream> 

class EVector 
{ 
public: 
    EVector(); 
    ~EVector(); 

    //Operator Overloading 
    friend std::istream& operator>>(std::istream&, EVector&); //Input Stream 
    friend std::ostream& operator<<(std::ostream&, EVector&); //Output Stream 
    EVector operator=(EVector&); 

private: 
    double* Tuples; 
    int dimension; 
}; 

を必要として包み以下これを追加しました。これは私のEVector.cppファイル

#include<iostream> 

EVector::EVector() { 
    dimension = 0; 
    Tuples = NULL; 
} 

これがされているどのようにI通常は私のダイナミックメモリを削除しますが、何らかの理由でこのプログラムでセグメンテーションフォールトを引き起こしています(少なくともVisual Studioではそう考えています)。

EVector::~EVector() { 
    if (Tuples != NULL) { 
     delete[] Tuples; 
    } 
} 
EVector.cpp

残り

istream& operator>>(istream& instream, EVector& vector) { 
    cout << "Enter the dimension of the Euclidian Vector: "; 
    instream >> vector.dimension; 

    vector.Tuples = new double[vector.dimension]; 
    cout << "Enter the Tuple's Values (The program will take values until all dimensions are full)" << endl; 

    //Take in Tuples values 
    for (int x = 0; x < vector.dimension; x++) { 
     cout << "Enter a Value (" << (vector.dimension - x) << " value(s) left): "; 
     instream >> vector.Tuples[x]; 
    } 

    return instream; 
} 

私はそれがこの機能とは何かを持っていると思う、それは< <と>>オペランド

ostream& operator<<(ostream& outstream, EVector& vector) { 
    outstream << "Dimension: " << vector.dimension << endl; 
    outstream << "Tuple's Values: ("; 
    for (int x = 0; x < vector.dimension; x++) { 
     outstream << vector.Tuples[x] << " "; 
    } 
    outstream << ")"; 

    return outstream; 
} 

ディープコピー機能を(過負荷に私の最初の時間です

EVector EVector::operator=(EVector& vector) { 
    if (this == &vector) { 
     return *this; 
    } 

    if (Tuples != NULL) { 
     delete[] Tuples; 
    } 

    dimension = vector.dimension; 
    Tuples = new double[dimension]; 

    for (int i = 0; i < dimension; i++) { 
     Tuples[i] = vector.Tuples[i]; 
    } 

    return *this; 
} 

答えて

0

恐らく二重削除です。詳細コピーでは、EVector要素のコピーが作成されます。 しかし、それらにはポインタが含まれています。 デストラクタが両方とも呼び出された場合、それらはセグメンテーションされます。 コピーするときにToublesポインタを無効にするか、真のディープコピーを行い、コピーされたオブジェクトのTubles Pointerの割り当てのために新しい[]を追加します。

+0

シガーなし。早速のご返事ありがとうございます。考えられる他のアイデアは? –

+0

ああ、私の馬鹿。ポインタをNULLに設定することは、要素のCOPYが存在するために役立ちません。要素のCOPYには、まだセットポインタが含まれています。デストラクタでポインタのprintfを実行すると、私の意図がわかります。 –

+0

または、ディープコピーのソースのTubles Pointerを無効にします。 –