我有以下问题:
在 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 的输出是:
...
让我们关注输出的前 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/