Vu le code suivant:C++ Copie Constructor Comportement étrange
class monomial {
public:
mp_real coe;
int exp;
monomial *next;
};
class polynomial
{
private:
monomial *start;
public:
polynomial();
~polynomial();
void destroy_poly(monomial *);
polynomial & operator=(const polynomial &);
polynomial(const polynomial&);
monomial * get_start();
};
polynomial::polynomial() {
start = NULL;
}
polynomial::~polynomial() {
if (start != NULL) {
destroy_poly(start);
}
start = NULL;
}
void
polynomial::destroy_poly(monomial * m) {
monomial * cm = m;
if (cm->next != NULL) {
destroy_poly(cm->next);
}
delete m;
}
polynomial::polynomial(const polynomial& p) {
if (p.start != NULL) {
start = new monomial();
start->coe = p.start->coe;
start->exp = p.start->exp;
monomial * tmpPtr = p.start;
monomial * lastPtr = start;
while (tmpPtr->next != NULL) {
monomial * newMon = new monomial();
newMon->coe = tmpPtr->next->coe;
newMon->exp = tmpPtr->next->exp;
lastPtr->next = newMon;
lastPtr = lastPtr->next;
tmpPtr = tmpPtr->next;
}
}
}
polynomial & polynomial::operator=(const polynomial &p) {
if (p.start != NULL) {
start = new monomial();
start->coe = p.start->coe;
start->exp = p.start->exp;
monomial * tmpPtr = p.start;
monomial * lastPtr = start;
while (tmpPtr->next != NULL) {
monomial * newMon = new monomial();
newMon->coe = tmpPtr->next->coe;
newMon->exp = tmpPtr->next->exp;
lastPtr->next = newMon;
lastPtr = lastPtr->next;
tmpPtr = tmpPtr->next;
}
}
return *this;
}
Puis, en main.cpp:
main() {
polynomial poly;
// code that initializes/sets values for
// various monomials pointed to by poly.start.
map<set<unsigned int>, polynomial> hash;
set<unsigned int> tmpSet;
tmpSet.insert(0);
hash[tmpSet] = poly;
}
je peux mettre un point d'arrêt sur la première ligne du constructeur de copie, et après que je step-over la ligne de hachage [tmpSet] = poly, p.start à l'intérieur du constructeur de copie est NULL. Ensuite, il est appelé une seconde fois, à quel moment p.start a des valeurs étranges à l'intérieur.
Qu'est-ce qui se passe?
Merci, Erich
EDIT 1: la pensée en ajoutant l'opérateur d'affectation à la classe polynomiale fixe, mais il n'a pas. Toujours avoir le même problème.
Vous avez corrigé l'opérateur d'affectation, mais pas si p.start est null, ce qui est la valeur par défaut. Partout avec 'if (p.start!= NULL) {'devrait se terminer par'} else {start = NULL;} '(bien, n'oubliez pas de désallouer l'opérateur d'assignation en premier) –
Eh bien peut-être que je me trompe ou quelque chose. S'il te plaît, ne m'appelle pas stupide, mais regarde. Vous mettez dans l'objet conteneur hash qui a des pointeurs à l'intérieur. Mettre l'objet dans le conteneur le fait copier (dans votre cas seulement l'adresse du pointeur). Lorsque le programme est hors de portée, il essaie de détruire le pointeur plusieurs fois. Donc là vous devriez utiliser un pointeur avec le nombre de références ou quelque chose. Corrigez si j'ai tort. – legion
Merci. J'ai ajouté la déclaration else et cela fonctionne maintenant. Pourriez-vous expliquer un peu plus pourquoi cela a réglé le problème? En outre, que voulez-vous dire par "désaffecter dans l'opérateur d'affectation d'abord"? –