2017-09-19 4 views
-2

S'il vous plaît, seigneurs de stackoverflow, ayez pitié de moi. Ma mission est due dans une heure et tout fonctionne - sauf que je ne peux pas pour la vie de moi comprendre pourquoi mon constructeur de mouvement (et par extension, mon devoir de copie) jette une faute de segmentation!C++: Move Constructor lançant un défaut de segmentation?

Informations supplémentaires si cela aide: le programme consiste à créer une structure de données appelée Chaîne qui stocke essentiellement un tableau de tout type de données, et un size_t avec la taille.

Merci d'avance et laissez-moi savoir si vous avez besoin de plus d'informations!

// 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

Votre constructeur de déplacement ne définit aucun membre de la classe, donc les opérations futures risquent d'échouer ... –

+0

True. Je ne pense pas que ce soit la question ici, cependant - ma mise en œuvre était exactement ce que mon professeur a suggéré. – BowmanBeric

+0

@ BowmanBeric alors votre professeur a tort. Ou vous avez mal compris ce qui vous a été dit. –

Répondre

2

Votre constructeur de déplacement est erroné. Il ne déplace pas le tableau de l'objet d'entrée pour en prendre possession et ne définit aucun des membres de données de l'objet en cours de construction. Il devrait ressembler davantage à ce lieu:

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

Autre possibilité:

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

Sur une note de côté, votre opérateur d'affectation peut être simplifiée afin qu'il puisse agir à la fois la copie missions et déplacer affectation:

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