OpenGL中的访问冲突
Access violation in OpenGL
我正在尝试验证我的矢量是否填充了一些数据,但当我尝试打印字符串时,程序会给出"访问违规读取位置0x00000010"错误。
这是我的代码:
for (unsigned int i = 0; i < mMeshes.size(); ++i) {
InitMesh(i, mScene->mMeshes[i], Positions, TexCoords, Normals, VertexBones, Indices);
}
std::cout << mBones[mBoneMap["forearm.L"]].Name << "n";
它在海关停了下来。这是我的InitMesh函数,从中可以正确执行cout:
for (unsigned int i = 0; i < pMesh->mNumBones; ++i) {
std::string BoneName = pMesh->mBones[i]->mName.data;
int BoneIndex = 0;
if (mBoneMap.find(BoneName) == mBoneMap.end()) {
BoneIndex = mNumBones;
mNumBones++;
BoneInfo bi;
mBones.push_back(bi);
}
else {
BoneIndex = mBoneMap[BoneName];
}
mBoneMap[BoneName] = BoneIndex;
mBones[BoneIndex].Name = BoneName;
std::cout << mBones[i].Name << "n";
AiToGLM(pMesh->mBones[i]->mOffsetMatrix, mBones[BoneIndex].OffsetTransform);
for (unsigned int j = 0; j < pMesh->mBones[i]->mNumWeights; ++j) {
unsigned int VertexID = mMeshes[MeshIndex].BaseVertex + pMesh->mBones[i]->mWeights[j].mVertexId;
VertexBones.at(VertexID).Add(i, pMesh->mBones[i]->mWeights[j].mWeight);
}
}
BoneInfo是一个具有两个匹配项和一个名为Name的字符串的结构。保存BoneInfos的矢量在头文件中:
struct BoneInfo {
std::string Name;
glm::mat4 OffsetTransform;
glm::mat4 FinalTransform;};
private:
std::vector<BoneInfo> mBones;
std::map<std::string, int> mBoneMap;
int mNumBones = 0;
我在这段代码中没有发现任何特别的错误。不幸的是,在C++中,当你在给定的行中出现segfault时,这并不意味着该行做错了什么,因为这个问题可能发生在数百万条执行过的指令之前,而哭泣的只是发现其数据被破坏的受害者。
在这种情况下,打印字符串时出现内存读取错误意味着字符串内存已被某人覆盖。根据我的经验,发生这种情况可能是因为来自数组的越界访问,或者因为已经销毁的对象再次被使用,因为有指针仍在指向它(当然,也可能是因为打印的数据结构已经被释放)。
您应该尝试使用标准库的调试版本重新编译,该版本检查每个数组的取消引用,并添加大量内存检查,以查找释放错误后的写入。这个程序会运行得很慢,但可能会让你发现真正的坏代码正在破坏内存。
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 集成显卡上的 OpenGL 访问冲突
- 在Visual Studio Community中使用glfw3 glew和opengl获取访问冲突异常
- OpenGL:glDrawArrays()引发异常(nvoglv32.dll)读取位置0x00000000时发生访问冲突
- Freetype 和 OpenGL 的访问冲突
- openGL - 调用 glMatrixMode(..) 时的访问冲突
- 使用OpenGL和DevIL调用glTextureParameteri时发生访问冲突
- OpenGL中的访问冲突
- opengl / glsl / sdl代码中的c++访问冲突
- Cuda+OpenGL互操作性,glDrawArrays()访问冲突
- 0xC0000005:访问冲突执行位置0x00000000.(OpenGL)