Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con la STL vector..

Estas en el tema de Problema con la STL vector.. en el foro de C/C++ en Foros del Web. Hola tengo este código: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #ifndef PERSONA_H #define PERSONA_H     class Persona {     public :     ...
  #1 (permalink)  
Antiguo 29/01/2012, 17:09
 
Fecha de Ingreso: enero-2011
Ubicación: Venezuela, Táchira
Mensajes: 96
Antigüedad: 13 años, 3 meses
Puntos: 10
Problema con la STL vector..

Hola tengo este código:

Código C++:
Ver original
  1. #ifndef PERSONA_H
  2. #define PERSONA_H
  3.  
  4.  
  5. class Persona
  6. {
  7.     public:
  8.         Persona();
  9.         virtual ~Persona();
  10.         void setEdad(int);
  11.         void setNombre(char*);
  12.         int getEdad();
  13.         char* getNombre();
  14.     protected:
  15.     private:
  16.         int edad;
  17.         char *nombre;
  18. };
  19.  
  20. #endif // PERSONA_H


Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstring>
  3. #include "persona.h"
  4.  
  5. Persona::Persona()
  6. {
  7.     //ctor
  8. }
  9.  
  10. Persona::~Persona()
  11. {
  12.     //dtor
  13. }
  14.  
  15. void Persona::setEdad(int e)
  16. {
  17.     edad = e;
  18. }
  19.  
  20. void Persona::setNombre(char *nom)
  21. {
  22.     nombre = new char[strlen(nom)];
  23.     strcpy(nombre,nom);
  24. }
  25.  
  26. int Persona::getEdad()
  27. {
  28.     return edad;
  29. }
  30.  
  31. char* Persona::getNombre()
  32. {
  33.     return nombre;
  34. }


aqui la clase main

Código C++:
Ver original
  1. #include <iostream>
  2. #include <vector>
  3. #include "persona.h"
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.     vector <Persona*> personas;
  10.     char r;
  11.     do
  12.     {
  13.         char *n;
  14.         int e;
  15.         Persona *p;
  16.         p = new Persona;
  17.  
  18.         cout << "\nNombre: ";
  19.         cin >> n;
  20.         cout << "\nEdad: ";
  21.         cin >> e;
  22.         p->setEdad(e);
  23.         p->setNombre(n);
  24.         personas.push_back(p);
  25.         cout << "\nContinuar? : ";
  26.         cin >> r;
  27.     }while(r=='s');
  28.  
  29.     cout << "\n\nMostrando.." << endl;
  30.  
  31.     for(int i=0; i<personas.size(); i++)
  32.     {
  33.         cout << "\nNombre: " << personas[i]->getNombre();
  34.     }
  35.  
  36.     return 0;
  37. }

bien el programa debe preguntar nombre y edad y crear una persona y almacenarlo en el vector personas hasta que el usuario diga que no quiere continuar.. y luego mostrar los nombres.. el programa lo hace muestra los nombres pero termina creo q abruptamente pq me sale un dialogo de error en windows que dice cerrar programa, buscar solucion en linea, depurar el programa.. pq será?? creo que es pq no libero la memoria que utilizo de ser esto cierto como lo hago?? gracias!
  #2 (permalink)  
Antiguo 29/01/2012, 17:30
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Problema con la STL vector..

Tienes que liberar la memoria de cada puntero que creas con new.

Tendrás que recorrer el vector y utilizar delete para destruir la memoria que habías reservado anteriormente con new.

Saludos.
  #3 (permalink)  
Antiguo 29/01/2012, 17:31
 
Fecha de Ingreso: enero-2011
Ubicación: Venezuela, Táchira
Mensajes: 96
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: Problema con la STL vector..

Cita:
Iniciado por alexg88 Ver Mensaje
Tienes que liberar la memoria de cada puntero que creas con new.

Tendrás que recorrer el vector y utilizar delete para destruir la memoria que habías reservado anteriormente con new.

Saludos.
gracias por responder.. pero como haria eso? podrias decirme? no tengo nada de experiencia con liberar memoria jeje
  #4 (permalink)  
Antiguo 30/01/2012, 02:20
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Problema con la STL vector..

Pues es muy sencillo, cada vez que usas new estás reservando memoria para un dato y cuando quieras liberar esa memoria sólo tienes que usar delete.

En tu caso, los punteros que utilizas los guardas en el vector, por lo tanto, no tienes más que recorrer el vector e ir utilizando delete por cada uno de ellos.

Ejemplo:

Código C++:
Ver original
  1. for(int i=0; i<personas.size(); i++)
  2.     {
  3.        delete personas[i];
  4.     }

Saludos.
  #5 (permalink)  
Antiguo 30/01/2012, 06:22
 
Fecha de Ingreso: enero-2011
Ubicación: Venezuela, Táchira
Mensajes: 96
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: Problema con la STL vector..

Cita:
Iniciado por alexg88 Ver Mensaje
Pues es muy sencillo, cada vez que usas new estás reservando memoria para un dato y cuando quieras liberar esa memoria sólo tienes que usar delete.

En tu caso, los punteros que utilizas los guardas en el vector, por lo tanto, no tienes más que recorrer el vector e ir utilizando delete por cada uno de ellos.

Ejemplo:

Código C++:
Ver original
  1. for(int i=0; i<personas.size(); i++)
  2.     {
  3.        delete personas[i];
  4.     }

Saludos.
hola gracias por responder... he colocado lo que me has dicho pero ahora es peor sale el error al ingresar el primer nombre, antes salia al final cuando mostraba los datos jeje
  #6 (permalink)  
Antiguo 30/01/2012, 08:40
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema con la STL vector..

Para empezar hay un error.
Haces:
char * n;
cin >> n;

Pero nunca reservaste memoria para n. Yo declararia a n con memoria estatica.
No se si eso solucione tus problemas. Pero el error que tienes no se debe a liberar memoria. Esta puede molestar cuando utilizas demasiadas cosas. dos o tres llamados a new no haran colapsar tu programa.

Saludos
  #7 (permalink)  
Antiguo 30/01/2012, 09:02
 
Fecha de Ingreso: enero-2011
Ubicación: Venezuela, Táchira
Mensajes: 96
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: Problema con la STL vector..

SOLUCIONADO...!

aqui el código completo:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <vector>
  3. #include "persona.h"
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.     vector <Persona*> personas;
  10.     char r;
  11.     do
  12.     {
  13.         char n[40];
  14.         int e;
  15.         Persona *p;
  16.         p = new Persona;
  17.  
  18.         cout << "\nNombre: ";
  19.         cin.getline(n,40);
  20.         cout << "\nEdad: ";
  21.         cin >> e;
  22.         p->setEdad(e);
  23.         p->setNombre(n);
  24.         personas.push_back(p);
  25.         cout << "\nContinuar? : ";
  26.         cin >> r;
  27.     }while(r=='s');
  28.  
  29.     cout << "\n\nMostrando.." << endl;
  30.  
  31.     for(int i=0; i<personas.size(); i++)
  32.     {
  33.         cout << "\nNombre: " << personas[i]->getNombre();
  34.     }
  35.  
  36.     for(int i=0; i<personas.size(); i++)
  37.     {
  38.        delete personas[i];
  39.     }
  40.     return 0;
  41. }

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstring>
  3. #include "persona.h"
  4.  
  5. Persona::Persona()
  6. {
  7.     //ctor
  8. }
  9.  
  10. Persona::~Persona()
  11. {
  12.     //dtor
  13. }
  14.  
  15. void Persona::setEdad(int e)
  16. {
  17.     edad = e;
  18. }
  19.  
  20. void Persona::setNombre(char *nom)
  21. {
  22.     nombre = new char[strlen(nom)];
  23.     strcpy(nombre,nom);
  24. }
  25.  
  26. int Persona::getEdad()
  27. {
  28.     return edad;
  29. }
  30.  
  31. char* Persona::getNombre()
  32. {
  33.     return nombre;
  34. }

Código C++:
Ver original
  1. #ifndef PERSONA_H
  2. #define PERSONA_H
  3.  
  4.  
  5. class Persona
  6. {
  7.     public:
  8.         Persona();
  9.         virtual ~Persona();
  10.         void setEdad(int);
  11.         void setNombre(char*);
  12.         int getEdad();
  13.         char* getNombre();
  14.     protected:
  15.     private:
  16.         int edad;
  17.         char *nombre;
  18. };
  19.  
  20. #endif // PERSONA_H

Etiquetas: clase, programa, stl, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:26.