2012-11-03 5 views
4

Je travaille sur un projet en tant que devoir pour mon cours universitaire de programmation de systèmes. Je me suis vraiment trompé sur la question des pointeurs, des vecteurs, des piles et des tas.C++, vecteurs, pointeurs et objets confusion

Utilisation de C++. Je dois obtenir un vecteur d'objets qui sont des cours, et ces objets de cours ont plusieurs champs différents. Ce que je l'ai fait était le suivant:

vector<CoursesObject> coursevector; 

puis j'ai créé mes cours objet classe, qui contient l'espace laissé dans le cours et le nom des champs de cours. Maintenant, je veux ajouter un nouveau cours, je fais:

CoursesObject *theCourse = new CoursesObject(name, space); 

maintenant je veux l'ajouter au vecteur de gestionnaire:

coursevector.push_back(*theCourse); 

Avec tout ce que je sais, je créé un vecteur d'objets Cours sur la pile, et fait un nouveau pointeur vers un nouveau cours qui est sur le tas, et ajouté au vecteur de gestionnaire le pointeur theCourse qui pointe vers l'objet de cours dans le tas. Est-ce que ce que j'ai dit est correct?

Lorsque je tente de supprimer ces objets de cours, je fais:

for(int i=0; i<coursevector.size(); i++) 
    delete coursevector.at(i); 

qui me donne une erreur qu'il n'est pas un pointeur. Mais n'ai-je pas ajouté au POV un pointeur sur l'objet du cours?

S'il vous plaît quelqu'un d'expliquer, je dois gérer la mémoire correctement et il semble que je ne comprends pas bien.

+0

Vous pouvez utiliser vecteur <* CoursesObject> et utilisez les pointeurs de magasin à la place des objets. – Jimm

Répondre

4

Vous n'avez pas besoin d'utiliser du tout.

//This vector stores CoursesObject objects, 
//not pointers to CoursesObjects. 
vector<CoursesObject> coursevector; 
//Construct theCourse with automatic storage 
//duration. 
CoursesObject theCourse(name, space); 
//Copy theCourse into coursevector 
coursevector.push_back(theCourse); 
//theCourse will be automatically destroyed. 
//coursevector (and all the objects that it contains) 
//will be automatically destroyed. 
5

Ce

vector<CoursesObject> coursevector; 

est un vecteur de CourseObjects, donc il ne peut pas tenir CourseObject pointeurs. Lorsque vous faites ceci:

coursevector.push_back(*theCourse); 

vous obtenez une copie du CoursesObject pointé par theCourse stocké dans le vecteur. Vous n'avez pas besoin de supprimer des entrées du vecteur. En fait, vous ne pouvez pas, car il ne contient pas de pointeurs.

programme Vous serait beaucoup plus simple si vous venez de l'allocation dynamique évité:

coursevector.push_back(CoursesObject(name, space)); 
+0

donc l'objet lui-même (pas le pointeur) est stocké dans le vecteur gestionnaire? Et aussi, de cette façon, j'ai seulement besoin de supprimer le pointeur theCourse, non? – TheNotMe

+0

@ user1656647 Une ** copie ** de l'objet lui-même est stockée. Alors oui, il suffit de supprimer l'original, mais je ne pense pas qu'il y ait une raison de l'allouer dynamiquement en premier lieu. – juanchopanza

+0

génial. alors cela me laisse juste avec la question sur COMMENT supprimer l'objet de cours lui-même du tas? – TheNotMe

0

tous vos objets ne sont pas attribués de façon dynamique, de sorte que vous ne pouvez pas les supprimer à tout moment au cours du programme. Rappelez-vous que vous ne pouvez pas supprimer l'objet une fois qu'ils sont alloués dynamiquement:

int Var1 = 0; //cannot be deleted, scope and life will exist for the life of program 
int * Var2 = new int; //CAN be deleted, dynamically allocated. 

delete Var2; //free memory 

Vous pouvez cependant supprimer votre dernier objet, qui est un pointeur. Je voudrais attraper le dernier élément du vecteur et appeler delete (ce qui devrait être votre pointeur vers la classe).

+0

donc, l'objet de cours avec le nom et l'espace, où est-il assis? dans le tas ou la pile? parce que je l'ai fait en tant que nouvel objet CourseObject (nom, espace) ... – TheNotMe

+0

Je ne suis pas tout à fait en train de suivre, mais changer simplement votre objet de cours en coursobject * vous permettrait de supprimer des variables, vu que vous ajoutez des pointeurs au vecteur objets cette fois-ci. –

+0

super, merci! – TheNotMe

0

quand vous faites ceci:

coursevector.push_back(*theCourse); 

vous fait déréférencement le pointeur thecourse, de sorte que vous ajoutez une copie de l'objet. Vous devez déclarer un vecteur de pointeurs CourseObject:

vector<CoursesObject *> coursevector; 

Ensuite, vous ajoutez un objet:

coursevector.push_back(theCourse); 

maintenant votre code pour supprimer les objets doivent travailler:

for(int i=0; i<coursevector.size(); i++) 
    delete coursevector.at(i); 
+1

Notez qu'un vecteur de pointeurs bruts n'est * pas * une bonne solution. –

0

coursevector peut contenir seulement CoursesObject s et pas de pointeurs vers CoursesObject s, donc vous n'avez pas besoin d'utiliser l'opérateur new (vérifiez la réponse de Mankarse). Mais, si vous voulez toujours contenir des pointeurs, puis modifiez la définition de coursevector à

vector<CoursesObject*> coursevector; 

et push_back la valeur du pointeur comme il est:

coursevector.push_back(theCourse);