2010-06-21 6 views
2

Mon programme se bloque quand il essaie d'affecter un objet à l'autre, est-ce que vous voyez quelque chose de mal à cela?Quel serait le problème avec cette surcharge d'opérateur d'affectation

Les variables sont les suivantes:

Field *fields[50]; 
int numOfFields; 
int currentField; 

La fonction est:

Screen& operator=(Screen &scr) { 
    if (this != &scr){ 
    for (int i = 0; i < 50; i++) 
     fields[i] = NULL; 

    for (int i = 0; i < scr.numOfFields; i++) 
     fields[i] = scr.fields[i]; 

    numOfFields = scr.numOfFields; 
    currentField = scr.currentField; 
    } 

    return *this; 
} 
+0

Savez-vous quelle ligne il se bloque sur? – Anthony

+1

Veuillez publier un programme de test complet, y compris les définitions de classe complètes, les prototypes de fonctions et main(), qui compile et se bloque. Parce que j'ai écrit un tel programme de test qui inclut chaque ligne de votre code et 1) il n'a même pas compilé sans ajouter un const à l'opérateur = et en faisant une fonction membre, et 2) après avoir fait cela, il compilé et a couru sans s'écraser. –

+0

A quoi sert Field? Possédez-vous l'objet 'Field' pointé ou non? Si vous le faites, vous avez des fuites de mémoire et des accidents. Si vous ne le faites pas, alors c'est bon ... mais nous ne pouvons pas deviner. –

Répondre

0

Vous devez utiliser un std::vector au lieu de votre tableau dynamique et je soupçonne que votre problème disparaîtra très rapidement.

Comme suggéré par MadCap, vous devez également utiliser des pointeurs partagés car il est recommandé d'utiliser des pointeurs avec un conteneur. Cela vous donnera également la sémantique de copie que vous attendez.

Cela annulerait la nécessité de ceci:

for (int i = 0; i < 50; i++) 
     fields[i] = NULL; 

et vous pouvez le remplacer:

for (int i = 0; i < scr.numOfFields; i++) 
     fields[i] = scr.fields[i]; 

avec un std :: copie, quelque chose comme:

fields.clear() 
std::copy(scr.fields.begin(), scr.fields.end(), fields.begin()); 

Par Ce faisant, vous supprimerez la possibilité que l'incident se produise en raison d'un accès au pointeur ou d'une erreur d'initialisation.

Un conseil simple est; arrêtez d'utiliser des tableaux dynamiques et des pointeurs bruts et commencez à utiliser std::vector et boost::shared_ptr au lieu de cela, cela vous évitera de vous heurter à ce genre de problèmes.

+0

Il ne disparaîtra probablement pas mais la source de l'erreur pourrait devenir apparente. Il y a aussi une chance que l'erreur ne se produise même pas ici. – wheaties

+0

Je ne crois pas que votre 'std :: copy' fonctionnera parce que vous n'allouez aucun objet réel dans le vecteur' fields' de la destination après l'effacement. Probablement 'std :: back_inserter' ferait l'affaire. –

1

Un problème peut être que scr.numOfFields dépasse le nombre de champs dans votre objet de destination.

Un autre problème est que, ou du moins il semble, vous attribuez des pointeurs à votre nouvel objet. Cela signifie que vous aurez une référence au même emplacement deux fois dans le programme. Que se passe-t-il s'il est supprimé à un endroit et que l'autre ne le sait pas? Lorsque vous essayez d'accéder à la mémoire, vous obtenez une erreur de segmentation.

Si vous avez Boost vous pouvez utiliser leurs pointeurs partagés pour éviter ceci: http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/smart_ptr.htm

+0

Le premier commentaire de Madcap est probablement le coupable ici: vous ne vérifiez pas que scr est de la même taille que le membre du champ avant d'essayer d'assigner à ses éléments.Ce que vous devez faire ici est de supprimer la mémoire allouée dans le champ (et ses sous-éléments si ceux-ci sont dynamiquement alloués), puis de réaffecter une nouvelle taille aux éléments que vous apportez. Assurez-vous également que la syntaxe de votre opérateur d'affectation est correct. Utilisez std :: vector que radman vous suggère si vous ne voulez pas vous soucier du suivi de l'allocation de mémoire. – twokats

Questions connexes