Pourquoi mon segment est endommagé?
J'obtiens une erreur de corruption de segment de mémoire, ne peut pas comprendre pourquoi.
Ma base :
h:
class Base
{
public :
Base(char* baseName, char* cityName);
virtual ~Base();
list<Vehicle*>::const_iterator GetEndList();
void PrintAllVehicles(ofstream &ResultFile) const;
char* GetBaseName() const;
char* GetLocation() const;
void InsertNewVehicleToBase(Vehicle* newVehicle);
list<Vehicle*>::const_iterator FindVehicle(char* id);
void RemoveVehicle (list<Vehicle*>::const_iterator beg);
private:
char* m_name;
char* m_location;
list<Vehicle*> m_baseVehicles;
};
rpc :
Base::Base(char* baseName, char* cityName)
{
m_name = new char [strlen(baseName)+1];
strcpy(m_name, baseName);
m_location = new char [strlen(cityName)+1];
strcpy(m_location, cityName);
}
Base::~Base()
{
delete [] m_name;
delete [] m_location;
//m_baseVehicles.clear();
}
armée de terre destructeur :
Army::~Army()
{
list<Base*>::iterator baseIter = m_basesList.begin();
for (baseIter ; baseIter != m_basesList.end() ; ++baseIter)
delete (*baseIter);
m_basesList.clear();
}
Ce que je fais mal?
Comment m_basesList obtenir remplie en premier lieu?
Nous ne pouvons pas dire si nous avons compilable code.
En aparté, pourquoi êtes-vous à l'aide de char* et non pas std::string.
devoirs exigence.
moron exigence (mauvais jeu de mots 😉 )
Nous ne pouvons pas dire si nous avons compilable code.
En aparté, pourquoi êtes-vous à l'aide de char* et non pas std::string.
devoirs exigence.
moron exigence (mauvais jeu de mots 😉 )
OriginalL'auteur Roy Gavrielov | 2010-09-27
Vous devez vous connecter pour publier un commentaire.
Il n'y a évidemment rien de mal avec le code que vous avez montré, si les chances sont que l'erreur est dans le code, vous n'avez pas indiqué.
La plus immédiatement suspect chose pour moi est que la
Base
classe possède deux pointeurs et ne possède pas de constructeur de copie ou d'affectation définies par l'opérateur. Cela signifie que vous ne devez jamais copier unBase
objet, vous allez vous retrouver avec deuxBase
objets pointant vers les mêmes données, et quand ils détruisent, ils vont le supprimer à deux reprises, provoquant une altération de tas.La
Army
classe peut aussi avoir ce problème (car il possède plusieursBase
pointeurs), mais vous n'avez pas afficher la définition de la classe, de sorte qu'il n'est pas évident de savoir si il a un constructeur de copie et l'opérateur d'affectation ou pas.Enfin, vous n'avez pas indiqué où le
Base
les objets sont alloués. Est-il possible qu'ils sont en train d'être passé dans uneArmy
objet et également supprimé quelque part à l'extérieur de laArmy
objet? Ou peut-être laBase*
contenue par laArmy
objet se référant à des objets sur la pile ne doit pas être supprimé?Base
objet est passé en paramètre, elle DOIT être faite par référence (si ce n'est que le pointeur). Dans mon cas, c'était une simple structure qui a été trivialement copier-construit (et vous ne voulez pas savoir d'où dans mon code qui bug surface) thx dude 🙂OriginalL'auteur Tyler McHenry
Visible des problèmes avec ce code:
raw pointeurs dans des conteneurs STL
overcomplicates code de nettoyage
en C++ code de l'odeur"
OriginalL'auteur Steve Townsend
Rien de mal avec le morceau de code donné.
Mais avec ce genre de code, il y a une forte possibilité de mutiple de suppression, je veux dire deletin un bloc de mémoire deux fois qui conduit à la corruption de segment.
OriginalL'auteur bala sreekanth
Vous n'avez pas de poste de la partie du code qui a le problème, parce que tout cela semble assez normal. Cependant, il a beaucoup de const-correctness problèmes:
Les chaînes doivent être transmis en tant que
const char*
, sauf s'ils sont en cours de modification.Aucune idée si cela doit être
virtual
; ne peut pas voir ce que ses sous-classes.Devrait être un const méthode, puisque c'est un
const_iterator
:list<Vehicle*>::const_iterator GetEndList() const;
Ces devrait revenir
const char*
, depuis votre code n'est pas configuré pour gérer le nom et l'emplacement en cours de modification.De nouveau, doit être un const méthode:
list<Vehicle*>::const_iterator FindVehicle(char* id) const;
Vous n'avez pas besoin
m_baseVehicles.clear();
parce qu'il arrive de toute façon à droite après le destructeur. Toutefois, vous devez supprimer les véhicules, s'ils ne sont pas référencés, ou vous aurez une fuite."destructeur". Et où est le reste de
Army
?Encore une fois, vous n'avez pas besoin
m_basesList.clear();
.OriginalL'auteur Mike DeSimone
Je ne vois pas de problème. Tout comme Matt Kane dit, comment fait-il peuplé?
OriginalL'auteur Prof. Falken
Altérations de tas venez de copier plus de données dans un alloués tas de cellules de la mémoire allouée à la cellule. Le début et la fin de tas de cellules contenant les données que lors de l'écrasement sera signalé comme un tas de corruption.
Vous n'avez pas posté tout le code et je ne vois pas un problème dans le code que vous avez posté, mais je vous conseille à l'aide d'un outil de mémoire comme Valgrind pour vous aider à diagnostiquer le problème.
OriginalL'auteur doron