J'ai une classe appelée Matrix avec 2 dimensions pointeur bool ** matrix.pourquoi l'opérateur d'appel d'appel déclenche la fonction de destruction?
oeil à ce code:
void Matrix::operator=(const Matrix& A){
cout << "address in A : " << A.matrix << endl ;
cout << "address in y : " << matrix << endl ;
//return *this;
}
J'ai appelé mon opérateur = dans ma fonction principale comme ceci:
Matrix x(3,5);
Matrix y(3,5);
x.set(1,4,1);
cout << "address out X: " << x.matrix << endl;
cout << "address out Y: " << y.matrix << endl;
y = x;
cout << "address out X: " << x.matrix << endl;
cout << "address out Y: " << y.matrix << endl;
Le desctructor est comme ceci:
Matrix::~Matrix(){
cout << "address de : " << matrix <<endl;
for (int i=0;i<m;i++)
delete[] matrix[i];
delete[] matrix;
cout << "address de finish : " << matrix <<endl;
}
Quand je exécuter mon programme en xcode je reçois:
address out X: 0x100103ab0
address out Y: 0x100103af0
address in A : 0x100103ab0
address in y : 0x100103af0
address out X: 0x100103ab0
address out Y: 0x100103af0
address de : 0x100103af0
address de finish : 0x100103af0
address de : 0x100103ab0
address de finish : 0x100103ab0
et il est l'air bien, mais quand je change la fonction = opérateur comme ceci:
Matrix Matrix::operator=(const Matrix& A){
cout << "address in A : " << A.matrix << endl ;
cout << "address in y : " << matrix << endl ;
return *this;
}
Je reçois cela comme résultat:
address out X: 0x100103ab0
address out Y: 0x100103af0
address in A : 0x100103ab0
address in y : 0x100103af0
address de : 0x100103af0
address de finish : 0x100103af0
address out X: 0x100103ab0
address out Y: 0x100103af0
address de : 0x100103af0
Thesis(26190) malloc: *** error for object 0x100103b10: pointer being freed was not allocated
quelqu'un peut me expliquer pourquoi le destructor déclenche plus tôt dans le dernier code?! et comment puis-je empêcher
vous remercie à l'avance
Pouvez-vous poster votre déclaration pour votre classe et aussi le code qui remplit (initialise) votre objet? –
Conseil rapide: jetez tout cela et écrivez un simple wrapper autour de 'std :: vector'. Ecrire le tout sera probablement moins de travail que de réparer ce que vous avez maintenant. –
La réponse de Mark B est correcte, mais si vous obtenez cette erreur, vous avez d'autres problèmes, très probablement dans votre constructeur de copie, que je suppose que vous n'avez pas réussi à écrire. –