Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Zodiak98 en 18 Noviembre 2015, 02:32 am



Título: [C++] Liberación de memoria dinámica.
Publicado por: Zodiak98 en 18 Noviembre 2015, 02:32 am
Vean, estaba haciendo una especie de "juego", y a la hora de programar la rutina de las balas me ha surgido un problema, podemos disparar las veces que queramos y no pasará nada, pero en el momento cuando la última bala llega al tope, el programa deja de funcionar.

El error está (creo) en la liberación de la memoria dinámica, no sé qué estoy haciendo mal. Verán, esta es la parte:

Código
  1.        for(it = balas.begin(); it != balas.end(); ++it) {
  2.            (*it)->borrar_bala((*it)->GetX(),(*it)->GetY());
  3.            if(!(*it)->rng_fuera()) {
  4.                (*it)->mod_pos_bala((*it)->GetY());
  5.                (*it)->pintar_bala();
  6.            }
  7.            else {
  8.                delete (*it);
  9.                balas.erase(it);
  10.            }
  11.        }
  12.  

La función rng_fuera() retorna un valor booleano, retorna true si la bala ha llegado al tope, es decir, cuando y = 0. Y false en caso contrario.

Entonces yo, como se muestra arriba, borro de la pantalla la posición actual de la bala, si ha llegado al tope, pues libero la memoria y borro ese elemento del vector, en caso contrario modifico la posición actual de la bala a la nueva posición y la pinto. Pero algo sucede y no puedo encontrar el error.

Si necesitan el código completo para entenderlo mejor, pídanmelo y lo publico en los comentarios. :)


Título: Re: [C++] Liberación de memoria dinámica.
Publicado por: furciorifa en 18 Noviembre 2015, 18:54 pm
Estás liberando un puntero y luego un puntero doble.


Título: Re: [C++] Liberación de memoria dinámica.
Publicado por: Zodiak98 en 18 Noviembre 2015, 19:52 pm
It es un iterador de un vector.

Ya corregí el error, estaba usando un vector y en realidad tenía que usar una lista. Estaba buscando diferencias y resulta que por estar todo el tiempo generando nuevas balas y eliminando encontré esto:

Lists are faster when you regularly need to insert elements in between two other elements, or delete elements from such positions though. Insertions and erasures are cheap no matter where in the list they occur. Iterators remain valid even when you add or remove elements from the list.

Así que simplemente cambié de un vector a una lista y funcionó. Escribo esto por si a alguien se le presenta lo mismo.

Pero gracias por responder igual. :)