push_back à un vecteur

J’ai un problème étrange. J’ai un vecteur sur lequel j’aimerais pousser des objects pour aimer:

vector* dems = new vector(); DEMData* demData = new DEMData(); // Build DEMDATA dems->push_back(*demData); 

Il y aura quelques centaines d’objects DEMData dans le vecteur. Le problème est que lorsque ce code est terminé, tous les éléments sont égaux au dernier élément “repoussé” au vecteur?

Pourquoi les autres objects sont-ils remplacés dans le vecteur?

modifier:

La classe DemData est simple, il s’agit simplement d’une structure de données avec des setters et des getters:

  class DEMData { private: int bitFldPos; int bytFldPos; const char* byteOrder; const char* desS; const char* engUnit; const char* oTag; const char* valType; int index; public: void SetIndex(int index); int GetIndex() const; void SetValType(const char* valType); const char* GetValType() const; void SetOTag(const char* oTag); const char* GetOTag() const; void SetEngUnit(const char* engUnit); const char* GetEngUnit() const; void SetDesS(const char* desS); const char* GetDesS() const; void SetByteOrder(const char* byteOrder); const char* GetByteOrder() const; void SetBytFldPos(int bytFldPos); int GetBytFldPos() const; void SetBitFldPos(int bitFldPos); int GetBitFldPos() const; friend std::ostream &operator<<(std::ostream &stream, DEMData d); }; 

MODIFIER:

Je suis en train de lire un fichier XML et de construire des objects DEMData en fonction des atsortingbuts de chaque élément xml:

 DEMData demData; for (i = 0; attr[i]; i += 2) { if(strcmp(attr[i],"BitFldPos") == 0) { demData.SetBitFldPos(*attr[i + 1] - '0'); } else if(strcmp(attr[i],"BytFldPos") == 0) { char* pEnd; int tmp = strtol(attr[i + 1],&pEnd,10); demData.SetBytFldPos(tmp); } else if(strcmp(attr[i],"ByteOrder") == 0) { demData.SetByteOrder(attr[i + 1]); } else if(strcmp(attr[i],"DesS") == 0) { demData.SetDesS(attr[i + 1]); } else if(strcmp(attr[i],"EngUnit") == 0) { demData.SetEngUnit(attr[i + 1]); } else if(strcmp(attr[i],"OTag") == 0) { demData.SetOTag(attr[i + 1]); } else if(strcmp(attr[i],"ValTyp") == 0) { demData.SetValType(attr[i + 1]); } else if(strcmp(attr[i],"idx") == 0) { char* pEnd; int tmp = strtol(attr[i + 1],&pEnd,10); demData.SetIndex(tmp); } //printf(" %s='%s'", attr[i], attr[i + 1]); } // Insert the data in the vector. dems.push_back(demData); 

Pourquoi atsortingbuez-vous le vecteur à nouveau? Pourquoi atsortingbuez-vous votre object DEMData temporaire avec new?

Un vector stocke une copie de ce que vous lui transmettez, et non de ces données. Par conséquent, à moins de supprimer l’object DEMData que vous avez atsortingbué à new, vous perdez de la mémoire chaque fois que vous poussez un élément sur le vecteur. De même, vous vous préparez à résoudre des problèmes de fuite de mémoire en allouant le vecteur de manière dynamic.

En ce qui concerne la raison pour laquelle les objects du vecteur semblent tous contenir les mêmes données, il est fort probable que vous en ayez davantage – probablement des pointeurs combinés à un copieur incorrect qui finit par faire des copies superficielles à quelques endroits Mais comme vous ne nous avez pas montré ce code, ce n’est qu’une hypothèse.

Edit: Maintenant que vous avez ajouté le code de votre classe DEMData, il semble que la supposition ci-dessus soit correcte: vous avez des pointeurs et aucun outil de copie défini par l’utilisateur, vous obtenez donc une copie superficielle.

Dans un premier temps, je supprimerais tous les membres du caractère de pointeur et les remplacerais par std::ssortingng s. Les membres int devraient être corrects – les copier copiera les valeurs.

Edit2: Compte tenu de ce que vous faites avec ces variables membres, il semblerait que vous devriez envisager d’utiliser deux std::map s – un pour les variables std::ssortingng et un pour les variables int .

Veuillez noter que votre vecteur ne contient pas de références aux objects, mais à leurs copies . Cela signifie qu’après avoir enregistré dans votre vecteur une instance nouvellement créée de DEMData et mis à jour l’object, l’entrée correspondante dans le vecteur ne sera pas mise à jour.

Vous devez faire de votre magasin de vecteurs DEMData* et de push_back un pointeur et non une valeur pointée.

Je suppose que les chaînes dans les objects sont les mêmes. Vous utilisez probablement le même object demData pour renseigner le vecteur.

Et puisque vous utilisez le constructeur de copie par défaut, toutes les copies contiennent les mêmes pointeurs (char *). Si vous modifiez le contenu de la mémoire référencée par ces pointeurs, toutes les copies “voient” les modifications.

Votre classe DEMData nécessite un constructeur de copie et un destructeur afin de gérer la mémoire des chaînes. En l’état actuel des choses, il est probable DEMData object DEMData est créé, inséré dans le vecteur qui crée une nouvelle instance de DEMData avec les mêmes valeurs de pointeur. Ensuite, vous détruisez le DEMData origine (puisqu’il n’y a pas de destructeur), ce qui laisse les pointeurs dans le vecteur. Ensuite, lorsque vous créez un nouveau DEMData il obtient les mêmes emplacements mémoire (par hasard) et finalement, tous les objects sont dirigés vers les mêmes emplacements.

Je ne suis pas sûr que dans ce cas, cela ait un rapport avec le vecteur lui-même … La façon dont vous utilisez les pointeurs sur le vecteur et sur demData (au lieu de les allouer sur la stack) semble un peu suspecte.

Je m’attendrais à ce que le code C ++ normal ressemble à ceci:

 vector* dems = new vector(); DEMData demData // Build DEMDATA dems->push_back(demData); ... delete dems; 

Pouvez-vous coller le rest de votre code? ou peut-être la boucle qui fait le bâtiment demData?