c++ - punteros - ¿Se borran los datos del puntero de matriz entre las llamadas a funciones sin un comando explícito?
punteros en c (1)
Tengo el siguiente problema:
En un programa de C ++, tengo una estructura de datos global declarada como Renderer Rendering_Handler
, que contiene un campo de miembro definido como vector<Render_Info> visble objects
.
Lo que las estructuras de datos están haciendo no es importante, son envoltorios necesarios para abstraer datos para paralelizar mi programa.
Para que quede claro, Rendering_Handler es completamente global, y de hecho es un singleton (puedo confirmar al 100% que el constructor ha sido llamado una vez y solo una vez para esta clase).
He declarado el siguiente método de clase:
Render_Info* Renderer::add_Render_Info()
{
visible_objects.push_back(Render_Info());
return &(visible_objects.back());
}
Bastante simple, crea una nueva estructura Render_Info
, la agrega a la matriz visible_objects
y devuelve un puntero al objeto.
Una estructura de datos diferente llamada Chunk
tiene un constructor definido como
Chunk::Chunk(vec3 offset, World* w)
{
/*initialize some values*/
draw_info = Rendering_Handler->add_Render_Info();
draw_info->VBOs = vector<GLuint>(5);
/*initialize OpenGL VAOs, VBOs and other buffer objects*/
cout << draw_info->VBOs.size() << endl;
cout << draw_info << endl;
}
También tiene un método definido como:
void Chunk::update_render_info()
{
cout << draw_info->VBOs.size() << endl;
cout << draw_info << endl;
/*OpenGL stuff*/
}
Y finalmente
Tenemos el método que inicializa todo:
World::World()
{
/*Initialize chunks in a circular 3D array*/
loaded_chunks = new Chunk_Holder(h_radius, h_radius, v_radius, this);
for(int i=0; i<h_radius; i++)
{
for(int j=0; j<h_radius; j++)
{
for(int k=0; k<v_radius; k++)
{
(*loaded_chunks)(i,j,k)->update();
}
}
}
}
La salida del rpgram es:
...
Centrémonos en el frist 2 y las últimas 2 líneas del resultado, que corresponden a las instrucciones de impresión que he agregado para la depuración.
Las primeras 2 líneas indican que se agregaron 5 elementos al búfer en la ubicación 0x556edb7ae200
Las últimas 2 líneas me dicen que el mismo buffer (el mismo ya que la ubicación de la memoria es la misma) ahora contiene 0 elementos.
Como puede ver en las instantáneas del código, no se llama a ninguna función entre crear los fragmentos y actualizarlos. ¿Alguien tiene una idea de lo que podría estar causando la desaparición de estos elementos?
¿No reservé correctamente la memoria? ¿Se están borrando estos objetos sin mi conocimiento debido a una asignación incorrecta?
Creo que el problema es que está almacenando punteros a elementos en vectores y al mismo tiempo sigue llamando a vector::push_back
que de vez en cuando tiene que cambiar el tamaño del vector y mover todos los elementos a la nueva porción de memoria. Esto invalidará todos los indicadores que haya obtenido anteriormente.
Para darle más contexto: el vector
almacena sus elementos en un pedazo continuo de memoria. Cuando se llama a vector::push_back
y no queda espacio libre en este trozo de memoria, el vector
asignará otro trozo de memoria con el doble del tamaño del trozo viejo. Luego copiará / moverá todos los elementos del antiguo fragmento al nuevo. Finalmente, el viejo pedazo será destruido. Cuando llame a &(visible_objects.back())
obtendrá una dirección en la memoria que está dentro de la porción de memoria actual propiedad de visible_objects
. Si posteriormente se llama a visible_objects
y visible_objects
tiene que migrar a un nuevo fragmento de memoria más grande, todas las direcciones obtenidas anteriormente quedarán obsoletas, ya que apuntan al antiguo bloque de memoria que se ha destruido.