2015-10-28 6 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"; 

Он останавливается на соиЬ. И вот моя InitMesh функция, от которой соиЬ выполняется правильно:

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 и строка называется имя. Вектор, который держит 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++ вы получаете segfault в заданной строке, это не означает, что строка делает что-то неправильно, потому что проблема могла произойти с миллионами выполненных инструкций раньше и кто плачет, это просто жертва, которая обнаруживает, что ее данные повреждены.

В этом случае ошибка чтения памяти при печати строки означает, что строка памяти была перезаписана кем-то. Мой опыт говорит о том, что это, вероятно, произошло из-за отсутствия доступа из массива или из-за того, что объект, который был уже уничтожен, использовался снова, поскольку указатель все еще указывал на него (или потому, что вы печатаете структуру данных, которая уже был освобожден, конечно).

Вы должны попытаться перекомпилировать версию отладочной версии стандартной библиотеки, которая проверяет все разыменования массива, а также добавляет много проверок на память для ошибок записи после удаления. Программа будет работать медленно, но, вероятно, укажет вам на настоящий плохой код, который повреждает память.

Смежные вопросы