que punteros puntero programacion parametros funciones declaracion como cadenas c++ pointers memory-management

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.