2017-09-19 1 views
-2

Bitte, Herren von stackoverflow, hab Erbarmen mit mir. Meine Aufgabe ist in einer Stunde fällig und alles funktioniert - außer dass ich nicht für mein Leben herausfinden kann, warum mein Move-Konstruktor (und damit meine Kopieraufgabe) einen Segmentierungsfehler auslöst!C++: Move Constructor wirft einen Segmentierungsfehler?

Zusätzliche Informationen, wenn es hilft: Das Programm soll eine Datenstruktur namens Chain erzeugen, die grundsätzlich ein Array eines beliebigen Datentyps und ein size_t mit der Größe speichert.

Vielen Dank im Voraus und lassen Sie mich wissen, wenn Sie weitere Informationen benötigen!

// Copy-constructor. 
Chain(const Chain &rhs) { 
    size_ = rhs.size(); 
    array_ = new Object[size_]; 
    for (int i = 0; i < size_; i++) { 
     array_[i] = rhs.array_[i]; 
    } 
} 

// Copy-assignment. 
Chain& operator=(const Chain &rhs) { 
    Chain copy = rhs; 
    std::swap(*this, copy); 
    return *this; 
} 

// Move-constructor. 
Chain(Chain &&rhs) { 
    rhs.array_ = nullptr; 
} 
+0

Ihr Bewegungskonstruktor setzt keine der Klassenmitglieder, sodass zukünftige Operationen wahrscheinlich fehlschlagen ... –

+0

Wahr. Ich denke nicht, dass das hier das Thema ist - meine Umsetzung war genau das, was mein Professor vorgeschlagen hat. – BowmanBeric

+0

@BowmanBeric dann ist dein Professor falsch. Oder du hast missverstanden, was dir gesagt wurde. –

Antwort

2

Ihr Bewegungskonstruktor ist falsch. Das Array des Eingabeobjekts wird nicht verschoben, um es zu übernehmen, und es werden keine Datenelemente des zu erstellenden Objekts festgelegt. Es sollte mehr so ​​aussehen statt:

Chain(Chain &&rhs) { 
    size_ = rhs.size(); 
    array_ = rhs.array_; 
    rhs.array_ = nullptr; 
    rhs.size_ = 0; 
} 

Alternativ:

Chain(Chain &&rhs) : array_(nullptr), size_(0) { 
    std::swap(size_, rhs.size_); 
    std::swap(array_, rhs.array_); 
} 

Auf einer Seite zur Kenntnis, kann Ihr Zuweisungsoperator vereinfacht werden, so dass es sowohl als Kopie-Zuordnung handeln und sich bewegen kann Zuweisung:

Chain& operator=(Chain rhs) { 
    std::swap(*this, rhs); 
    return *this; 
}