OpenGL中的访问冲突

Access violation in OpenGL

本文关键字:访问冲突 OpenGL      更新时间:2023-10-16

我正在尝试验证我的矢量是否填充了一些数据,但当我尝试打印字符串时,程序会给出"访问违规读取位置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时,这并不意味着该行做错了什么,因为这个问题可能发生在数百万条执行过的指令之前,而哭泣的只是发现其数据被破坏的受害者。

在这种情况下,打印字符串时出现内存读取错误意味着字符串内存已被某人覆盖。根据我的经验,发生这种情况可能是因为来自数组的越界访问,或者因为已经销毁的对象再次被使用,因为有指针仍在指向它(当然,也可能是因为打印的数据结构已经被释放)。

您应该尝试使用标准库的调试版本重新编译,该版本检查每个数组的取消引用,并添加大量内存检查,以查找释放错误后的写入。这个程序会运行得很慢,但可能会让你发现真正的坏代码正在破坏内存。