我正在尝试验证我的向量是否填充了一些数据但是当我尝试打印字符串时,程序会给出“访问冲突读取位置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是一个带有两个matices和一个名为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;
答案 0 :(得分:1)
我在这段代码中没有看到任何特别错误。不幸的是,在C ++中你得到一个给定行中的段错误并不意味着该行做错了什么,因为问题可能发生在之前的数百万个已执行的指令中,谁哭的只是发现其数据被破坏的受害者。
在这种情况下,打印字符串时出现内存读取错误意味着字符串内存已被某人覆盖。我的经验说,这可能是因为数组的越界访问或因为已经销毁的对象再次被使用,因为有一个指针仍然指向它(或者因为你正在打印一个数据结构,当然已经解除分配了。
您应该尝试使用检查每个数组取消引用的标准库的调试版本来重新编译,并且还会在内存中添加大量检查以用于写入后释放错误。该程序将慢慢运行,但可能会指向破坏内存的真正坏代码。