2015-10-28 126 views
0

我試圖驗證是否我的矢量充滿了一些數據,但是當我嘗試打印一個字符串,它的程序給出了「訪問衝突讀取位置0x00000010」的錯誤。訪問衝突在OpenGL

這裏是我的代碼:

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一個struct和一個名爲名稱的字符串。保存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; 
+1

檢查'mBoneMap [ 「forearm.L」]'的值,並確保它是<'mNumBones'(但> = 0)。 – keltar

回答

1

我在代碼中沒有看到任何特別的錯誤。不幸的是,當使用C++的時候,你在給定的行中得到了段錯誤並不意味着該行做錯了任何事情,因爲這個問題可能發生在數百萬條執行過的指令之前,誰在哭,只是發現其數據被破壞的受害者。

在這種情況下打印字符串時,內存讀取錯誤意味着字符串內存已經被別人覆蓋。我的經驗表明,這可能是因爲數組超出邊界的訪問權限,或者因爲已經被銷燬的對象再次被使用,因爲仍然有指向它的指針(或者因爲您正在打印一個數據結構當然已經被釋放)。

你應該嘗試與檢查每一個數組解引用,也是標準庫的調試版本重新編譯增添了不少的內存檢查寫後釋放錯誤。該程序將運行狗慢,但可能會指出你真正的壞代碼是破壞內存。