构造函数在错误的时间调用
Constructor called at wrong time
这与其说是对问题的求助,不如说是对解决问题后发现的特殊问题的质疑。我正在开发我的OpenGL初学者游戏,并试图编写一个OOP友好的渲染文件。所有vbo数据都存储在一个模型类中,并在构造函数中进行上传和缓冲。
从main的角度来看,这个结构经过了极大的简化,看起来像是:
int main(){
vector <Model> Models;
Graphics.GLInit();
Models.push_back(Model(vertices,texcoords,36,0));
Graphics.EnableAttributePointers();
main loop
{
Graphics.draw(Models,Textures,Entities);
}
return 0;
}
构造函数看起来像:
Model::Model(vector <vec3> &vertices,vector <vec2> &texcoords,int NumVertices,int StartVertex)
{
iNumVertices=NumVertices;
iStartVertex=StartVertex;
Vertices=vertices;
Texcoords=texcoords;
glGenBuffers(1,&vboVertex);
glGenBuffers(1,&vboTexcoord);
glBindBuffer(GL_ARRAY_BUFFER,vboVertex);
glBufferData(GL_ARRAY_BUFFER,Vertices.size()*12,Vertices.data(),GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,vboTexcoord);
glBufferData(GL_ARRAY_BUFFER,TexCoord.size()*8,TexCoord.data(),GL_STATIC_DRAW);
}
在绘图函数中调用glDrawArrays时,将出现分段故障:
0xC0000005 cannot access 0x00000000 yadda yadda.
所以我无数次地检查每件事,确保一切都有意义。最终,我把程序拆开,制作了一个更简单的版本,其中使用了完全相同的代码,而没有模型类。效果很好。由于发现Model类有问题,我最终将缓冲代码放入一个单独的函数中,在构造函数之后直接调用。这修复了它。
无论如何,所有这些都引出了一个问题,即为什么构造函数似乎被调用得不按顺序;在GLInit代码之前。这一点,或者说构造函数有一些我不知道的行为怪癖,其中OpenGL状态机由于某种奇怪的原因无法由他们正确修改。我对C++的了解只是高中阶段的业余时间,所以我是否遗漏了一些显而易见的东西?
我在想,既然你正在创建Model的向量,下面的代码
Models.push_back(Model(vertices,texcoords,36,0));
实际生成一个COPY(将调用复制构造函数),将副本推入向量。然后原始文件被删除。
看看Model类的实际数据成员会很有趣,还有"vec3"answers"vec2"的数据类型是什么?
我们也能看到析构函数吗?
相关文章:
- ::grpc::ServerReaderWriter 对象在另一个线程中一段时间后无法调用
- C++ 测量重复调用的函数的时间
- 我的 RSU 如何在静脉中以周期性的时间间隔调用函数
- 使用递归模板函数是否会引入函数调用开销,或者编译器是否大部分时间都内联它(下面的示例)?
- 尝试构造包装器测量函数调用时间时出现问题
- 查找系统调用需要多长时间的可能方法
- 在 CUDA 中,Nsight 不会在时间轴中显示 cuInit(0) 调用
- 我可以在编译时间执行该函数从未调用
- 触发编译时间错误时,constexpr函数的超载被调用
- 以前的代码似乎会影响以后函数调用的时间
- 带有两个递归调用的递归算法的时间复杂性
- 测量C 中函数调用的执行时间
- 我的函数返回的是打印到控制台,它只会在我调用它时每隔一段时间C++
- 在 C++ 中以周期性的时间间隔调用函数的视觉需求
- 构造函数在错误的时间调用
- 调用TerminateThread时线程实际终止的时间
- 在销毁任何具有自动存储持续时间的对象之前调用的回调
- 如何将 etrace 与动态库结合使用,以按时间顺序跟踪 C++ 中的函数调用
- Qt:有没有什么方法可以调用具有一定时间间隔的时隙序列
- 如何使函数在不同时间调用时返回不同的字符串?C++