OpenGL 中的访问冲突
Access violation in OpenGL
我正在尝试验证我的矢量是否填充了一些数据,但是当我尝试打印字符串时,程序给出了 "Access violation reading location 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";
它在 cout 处停止。这是我的 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++ 中你在给定的行中遇到段错误时,这并不意味着该行做错了什么,因为问题可能已经发生在数百万条已执行的指令之前,而哭泣的只是发现其数据已损坏的受害者。
在这种情况下打印字符串时出现内存读取错误意味着字符串内存已被某人覆盖。我的经验表明,这可能是由于数组的越界访问而发生的,或者因为已经被销毁的对象再次被使用,因为有一个指针仍然指向它(或者因为你正在打印一个数据结构当然已经被释放了)。
您应该尝试使用标准库的调试版本重新编译,该版本检查每个数组取消引用,并添加大量内存检查以发现释放后写入错误。该程序会 运行 变慢,但可能会指出破坏内存的真正错误代码。
我正在尝试验证我的矢量是否填充了一些数据,但是当我尝试打印字符串时,程序给出了 "Access violation reading location 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";
它在 cout 处停止。这是我的 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++ 中你在给定的行中遇到段错误时,这并不意味着该行做错了什么,因为问题可能已经发生在数百万条已执行的指令之前,而哭泣的只是发现其数据已损坏的受害者。
在这种情况下打印字符串时出现内存读取错误意味着字符串内存已被某人覆盖。我的经验表明,这可能是由于数组的越界访问而发生的,或者因为已经被销毁的对象再次被使用,因为有一个指针仍然指向它(或者因为你正在打印一个数据结构当然已经被释放了)。
您应该尝试使用标准库的调试版本重新编译,该版本检查每个数组取消引用,并添加大量内存检查以发现释放后写入错误。该程序会 运行 变慢,但可能会指出破坏内存的真正错误代码。