c++ - 在没有显式命令的情况下在函数调用之间清除数组指针数据?

标签 c++ pointers memory-management

我有以下问题:

在 C++ 程序中,我有一个声明为 Renderer Rendering_Handler 的全局数据结构。 ,其中包含定义为 vector<Render_Info> visble objects 的成员字段.

数据结构本身在做什么并不重要,它们是抽象数据以并行化我的程序所需的包装器。

需要明确的是,Rendering_Handler 是完全全局的,它实际上是一个单例(我可以 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 的输出是:

enter image description here

...

enter image description here

让我们关注输出的前 2 行和最后 2 行,它们对应于我为调试添加的打印语句。

前 2 行表示已将 5 个元素添加到位置 0x556edb7ae200 的缓冲区中

最后 2 行告诉我,同一个缓冲区(由于内存位置相同,所以相同)现在包含 0 个元素。

从代码快照中可以看出,在创建 block 和更新 block 之间没有调用任何函数。有没有人知道是什么导致这些元素消失?

我没有正确保留内存吗?这些对象是否由于分配错误而在我不知情的情况下被清除?

最佳答案

我认为问题在于您将指向元素的指针存储在 vector 中,同时您不断调用 vector::push_back它时不时地必须调整 vector 的大小并将所有元素移动到新的内存块。这将使你之前获得的所有指针失效。

为您提供更多上下文:vector 将其元素存储在连续的内存块中。当调用 vector::push_back 并且这 block 内存中没有剩余空间时,vector 将分配另一个内存块,其大小是旧 block 的两倍。然后它将所有元素从旧 block 复制/移动到新 block 。最后,旧 block 将被销毁。当您调用 &(visible_objects.back()) 时,您将在内存中获得一个地址,该地址位于 visible_objects 拥有的当前内存块内。如果稍后调用 visible_objects.push_back 并且 visible_objects 必须迁移到新的更大的内存块,那么之前获得的所有地址都将是陈旧的,因为它们指向旧的内存块已经被销毁了。

关于c++ - 在没有显式命令的情况下在函数调用之间清除数组指针数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47899289/

相关文章:

C++ vector ,返回与参数

c++ - MSXML 内存泄漏

c++ - Doxygen 如何记录 SC_MODULE 中定义的类?

c - 从 C 函数返回数组

c - 如何在结构中保存任意数量字符的数组

java - 我应该使用哪个 Java 集合来实现线程安全缓存?

python - pybind11: AttributeError: 尝试从 py 文件运行函数时,模块 'XXX' 没有属性 'YYY'

c - 如何在 C 中打印函数指针的值?

c - Valgrind 给出错误,但一切似乎都很好

objective-c - Objective-C 中使用单例保留循环