У меня есть следующая проблема:
В программе на С++ у меня есть глобальная структура данных, объявленная как Renderer Rendering_Handler
, которая содержит поле члена, определенное как vector<Render_Info> visble objects
.
То, что делают сами структуры данных, не имеет значения, они являются обертками, необходимыми для абстрагирования данных для распараллеливания моей программы.
Чтобы быть ясным, Rendering_Handler является полностью глобальным, и на самом деле это singleton (я могу на 100% подтвердить, что конструктор был вызван один раз и только один раз для этого класса).
Я объявил следующий метод класса:
Render_Info* Renderer::add_Render_Info()
{
visible_objects.push_back(Render_Info());
return &(visible_objects.back());
}
Достаточно просто, он создает новую структуру Render_Info
, добавляет ее в массив visible_objects
и возвращает указатель на объект.
Другая структура данных, называемая Chunk
, имеет конструктор, определенный как
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;
}
Он также имеет метод, определяемый как:
void Chunk::update_render_info()
{
cout << draw_info->VBOs.size() << endl;
cout << draw_info << endl;
/*OpenGL stuff*/
}
И наконец
У нас есть метод, который инициализирует все:
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();
}
}
}
}
Выходной сигнал rpgram:
...
Сфокусируйтесь на frist 2 и на последних 2 строках вывода, которые соответствуют операторам печати, которые я добавил для отладки.
Первые 2 строки указывают, что в буфер добавлено 5 элементов в месте 0x556edb7ae200
Последние две строки говорят мне, что один и тот же буфер (тот же, что и память) совпадает с 0 элементами.
Как вы можете видеть из привязок кода, между созданием кусков и их обновлением не вызывается никакой функции. Есть ли у кого-нибудь представление о том, что может вызвать диссипацию этих элементов?
Я не правильно зарезервировал память? Являются ли эти объекты очищенными без моего ведома из-за неправильного распределения?