Подтвердить что ты не робот

Данные указателя массива очищаются между вызовами функций без явной команды?

У меня есть следующая проблема:

В программе на С++ у меня есть глобальная структура данных, объявленная как 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 элементами.

Как вы можете видеть из привязок кода, между созданием кусков и их обновлением не вызывается никакой функции. Есть ли у кого-нибудь представление о том, что может вызвать диссипацию этих элементов?

Я не правильно зарезервировал память? Являются ли эти объекты очищенными без моего ведома из-за неправильного распределения?

4b9b3361

Ответ 1

Я думаю, проблема заключается в том, что вы храните указатели на элементы в векторе и в то же время продолжаете называть vector::push_back, которые каждый время от времени приходится изменять размер вектора и перемещать все элементы в новый кусок памяти. Это приведет к аннулированию всех указателей, которые вы получили ранее.

Чтобы предоставить вам больше контекста: vector хранит его элементы в непрерывной части памяти. Когда вызывается vector::push_back и в этом фрагменте памяти нет свободного места, тогда vector выделяет еще один фрагмент памяти с удвоенным размером старого фрагмента. Затем он скопирует/переместит все элементы из старого фрагмента в новый. Наконец, старый кусок будет уничтожен. Когда вы вызываете &(visible_objects.back()), вы получите адрес в памяти, который находится внутри текущего фрагмента памяти, принадлежащего visible_objects. Если вызывается более поздний visible_objects.push_back и visible_objects должен перейти на новый более крупный фрагмент памяти, тогда все адреса, полученные ранее, будут устаревшими, поскольку они указывают на старый фрагмент памяти, который был разрушен.