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

[SOLUCIONADO] problema crear objeto dentro de un vector

Estas en el tema de problema crear objeto dentro de un vector en el foro de C/C++ en Foros del Web. Hola os comento el siguiente problema. Tengo una clase que contiene como variable privada un vector de otra clase. Luego si desde la 1r clase ...
  #1 (permalink)  
Antiguo 13/04/2013, 13:26
vib
 
Fecha de Ingreso: marzo-2011
Mensajes: 43
Antigüedad: 13 años, 9 meses
Puntos: 0
problema crear objeto dentro de un vector

Hola os comento el siguiente problema.

Tengo una clase que contiene como variable privada un vector de otra clase.
Luego si desde la 1r clase intento crear un objeto de esa clase en el vector me da error.

Os comento que estoy usando SDL
aqui os dejo el problema.

Código:
class text{
   public:
   texto::texto()
   {
      fuente = TTF_OpenFont("ariblk.ttf", 30);
   }
   protected:
      TTF_Font *fuente;
}
class one{
    void crearTexto()
   {
       escrito.push_back(texto());
     //o
        escrito[0].texto();
    }
    protected:
        vector<texto>escrito;
}
EL CASO esque me da segmention fault por esto:
Código:
 fuente = TTF_OpenFont("ariblk.ttf", 30);
Pero claro nose como hacerlo :S
  #2 (permalink)  
Antiguo 13/04/2013, 13:30
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
Respuesta: problema crear objeto dentro de un vector

Protected no es lo mismo que private. Por otro lado te has confundido, no es texto sino text.
  #3 (permalink)  
Antiguo 13/04/2013, 13:32
vib
 
Fecha de Ingreso: marzo-2011
Mensajes: 43
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: problema crear objeto dentro de un vector

Error al escribirlo por aqui.. xd
no he echo copia pega...lo he escrito todo manualmente xd
Voy a editarlo :P

NO ME DEJA EDITARLO LO PONGO AQUI CORREJIDO ._. y si uso protected srry por decir private :P
Código:
class texto{
   public:
   texto::texto()
   {
      fuente = TTF_OpenFont("ariblk.ttf", 30);
   }
   protected:
      TTF_Font *fuente;
}
class one{
    void crearTexto()
   {
       escrito.push_back(texto());
     //o
        escrito[0].texto();
    }
    protected:
        vector<texto>escrito;
}
  #4 (permalink)  
Antiguo 14/04/2013, 08:14
vib
 
Fecha de Ingreso: marzo-2011
Mensajes: 43
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: problema crear objeto dentro de un vector

Hola de nuevo, vuelvo a comentar porque analizando los errores veo que es acerca del vector.. debo tener alguna confusion en usarlo.. haber si podeis ayudarme en solventar mi duda.
Código:
int main()
{
bool done=false;
vector<int> r;
r.push_back(19);
r.push_back(1);
r.clear();       
         while (!done) cout<<r[0]<<" "<<r[1]<<endl;
return 0;
}
Pues os comento...
pongo valores en el vector, luego vacio el vector con clear()
pues luego en el while no deberia escribir los valores, creo que deberia darme fallo de segmentacion por buscar posiciones que no existe, pero en vez de eso me imprime 19 1, porque? esque quizas no tengo claro el concepto y me estoy volviendo loco con este problema

Mil gracias!
  #5 (permalink)  
Antiguo 14/04/2013, 08:43
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: problema crear objeto dentro de un vector

"...pero en vez de eso me imprime 19 1, porque?..."

Te planteo el siguiente ejemplo: la persona A le dice a B que vive en la casa C, pero luego A se va a vivir al sitio D pero no le dice a B la nueva direccion, luego B necesita algo de A y lo va a buscar donde sabe (donde cree saber) que vive A que es la casa C: obviamente puede llamar y puede entrar pero dentro no encuentra A sino que encuentra algo parecido pero que no es A.

Si accedes directamente por posiciones (debido al funcionemiento interno de los vectores, que reservan memoria incluso estando vacios) no te dara error ("...creo que deberia darme fallo de segmentacion por buscar posiciones que no existe...") porque estas accediendo a posiciones de memoria reservada por el objeto vector pero que contienen datos basura. Esto sucede porque vas a buscar a B al sitio C cuando ese ha cambiado de casa ok? Luego, como hago para saber que el vector esta vacio? Facil, usa las funciones propias del vector:

Código:
int main() {
    vector<int> r;

    r.push_back(19);
    r.push_back(1);
    r.clear();

    //ojo, aqui sigui existiendo la posicion r[0], r[1]
    
    vector <int>::iterator itr;
    for(itr = r.begin(); itr < r.end(); itr++) {
        printf("%d", itr);
    }
}
return 0;
}
Puedes buscar mas informacion acerca de como funcionan los vectores (si te interesa es un tema muy apasionante), que son los datapools y como manipular bloques de memoria extra para tus aplicaciones.

Saludos
vosk
  #6 (permalink)  
Antiguo 14/04/2013, 09:08
vib
 
Fecha de Ingreso: marzo-2011
Mensajes: 43
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: problema crear objeto dentro de un vector

Entiendo!
Osea solo canvia de lugar el puntero.
Al hacer clear() el puntero vuelve a marcar el 1r valor para asi sobrescribirlo en memoria.
Ok

Pero, para eliminar luego todo lo que ha hecho el vector?
Me explico:
Si uso por ejemplo una array dinamica sea:
Código:
int* t;
t=new t[1];
t[0]=9;
delete t;
con delete elimino su rastro en memoria... esto con vector hay alguna manera?
porque me he mirado alguna web y he visto todas sus funciones pero la de eliminar su rastro en memoria no :S

Porque claro en algunos de mis programas dejo de usar el vector mientras el programa sigue funcionando y pensanba que con clear() ya eliminaba ese rastro.

Solo esta duda mas,
Gracias :D
  #7 (permalink)  
Antiguo 14/04/2013, 11:05
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: problema crear objeto dentro de un vector

"...esto con vector hay alguna manera?..."

En teoria no. Los pools de memoria se basan en reservar y administrar un bloque de memoria (de forma parecida a como haria un sistema de ficheros):

Código:
void *buffer;//4 bytes en el stack o en el heap o yo que se donde (un puntero)

vector <int> lista;//inicialmente 12 bytes en el stack
lista.push_back(1);//sizeof(int)*10000000
Digo 1000 com podria decir UINT_MAX, no se exactamente para cuantos elementos se hace la reserva, pero es seguro que hace una reserva para mas de 1 elemento (mas de 1 y mas de 10000). Esa reserva no se inicializa a nada, simplemente se reserva memoria que sigue manteniendo los datos usados por el proceso previo (puede ser casualmente un entero o un caracter o un noseque).

Como la administracion de ese pool de memoria la hace el objeto vector en vez del s.o. no existe la opcion (o la casualidad) de que se vaya sobreescribiendo con datos de otros procesos, sino que solo se sobreescribe cuando se le obliga a usar un espacio de su memoria marcado como libre ok?

Puedes comprobarlo tu mismo:

Código:
vector <int> lista;

printf("%d", lista[0]);//b.o.f., direccion de memoria no accesible

lista.push_back(3);
printf("%d", lista[0]);//valor 3
printf("%d", lista[5000]);//valor basura, direccion de memoria accesible pero no inicializada

lista.clear();
printf("%d", lista[5000]);//valor basura, direccion de memoria accesible pero no inicializada

printf("%d", lista.size());//contador interno de elementos disponibles 0

lista[0] = 5;//direccion de memoria disponible, valor previo 3, valor nuevo 5
printf("%d", lista[0]);//valor 5, incluso despues del clear sigue siendo un ruta valida dentro del pool reservado en el primer push_back
Otra cosa: el objeto vector reajusta su pool para albergar los datos necesarios pero no por unidades de elementos sino por bloques, es decir cuando declaras un vector se crea el objeto y su contador interno de elementos accesibles se inicializa a 0, es decir que para cada push_back comprobará si el pool permite el acceso a un nuevo elemento del tamaño declarado, si cabe un nuevo elemento pues se le asigna la posicion de memoria del pool y listos, si no cabe pues se reserva un nuevo bloque de memoria y se asigna la posicion correspondiente.

Y a lo que vamos: en teoria tienes que trabajar con las funciones adaptadas al caso, es decir que si vector::size() te dice que tiene 0 elementos es que no tienes que acceder a ninguno (aun cuando vector[0] exista y tenga incluso un valor real). De esto se desprende que si quieres eliminar un elemento del vector tienes que sobreescribirlo antes de liberarlo (le asignas p.ej. 0); esa posicion seguirá siendo accesible pero tendrá un valor controlado.

Esto es importante a tener en cuento cuando trabajas con vectores de punteros: si reservas memoria para un objeto (pongo el ejemplo con objetos en vez de enteros para exagerar el resultado y que se vea el impacto) y luego guardas en un vector un puntero a ese objeto, el vector en ningun caso controla la validez del objeto, aun cuando finalices y liberes la memoria usada por ese objeto el vector tendra una ruta valida de acceso al dato pero ese dato será a su vez una ruta a una posicion no valida.

Resumen: sobreeescribir, eliminar y bienvenido al apasionante mundo de los memory pools :)

Saludos
vosk

Etiquetas: int, objeto, variable, vector
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 09:28.