簡體   English   中英

訪問沖突讀取位置0xFFFFFFFFFFFFFFFFFF

[英]Access violation reading location 0xFFFFFFFFFFFFFFFF

我正在嘗試使用OpenGL演示分層動畫。 在早期階段,我試圖給“骨骼”對象一個對其父對象的引用。

在我的骨骼類中,我可以成功添加一個父對象,但是問題是當我調用hasParent() 它無法讀取this-> parent並由於以下異常而崩潰:

myprogram.exe中0x00007FF6CB723D43的未處理異常:0xC0000005:訪問沖突讀取位置0xFFFFFFFFFFFFFFFF。**

我的骨骼課程片段:

void Bone::addParent(Bone *bone)
{
    this->parent = bone;
    assert(this->parent);
}

bool Bone::hasParent()
{
    assert(this->parent); //this line causes the error
    if (this->parent)
        return true;
    else return false;
}

glm::mat4 Bone::getBoneModel()
{
    glm::mat4 parentModel = glm::mat4(1.0);
    if (hasParent())
        parentModel = parent->getBoneModel();
    //boneModel = parentModel * boneModel;
    return boneModel;
}

精簡了我的主要內容:

#define NUMBONES 3
Bone bone[NUMBONES];

int main( void )
{
    //------------------ Create Bones --------------------------
    float y = 0.0f;
    for (int i = 0; i < NUMBONES; i++)
    {
        bone[i] = Bone(i, vec3(0, y, -30), vec3(0, 0, 0), vec3(0, 0, 0));
        y += 5.0f;
    }

    //----------------- Make relationships ----------------
    bone[0].isRoot = true;
    bone[0].addChild(&bone[1]);
    bone[0].addChild(&bone[2]);
    bone[1].addParent(&bone[0]);
    bone[1].addChild(&bone[2]);
    bone[2].addParent(&bone[1]);

    do{
        ModelMatrix = bone[1].getBoneModel();
    }
    return 0;
}

我發現很難理解引用和指針,所以我希望這對其他人來說是顯而易見的!

編輯:

我的構造函數:

Bone::Bone() {
    parent = NULL;
    child = NULL;
    boneID = 0;
    boneModel = glm::mat4(1.0);
}

Bone::Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)
{
    boneID = ID;
    isRoot = false;
    pos = T;

    //---------- set boneModel ------------------
    glm::mat4 RotationMatrix = glm::mat4(1.0);
    glm::mat4 TranslationMatrix = translate(glm::mat4(), pos);
    glm::mat4 ScalingMatrix = scale(glm::mat4(), glm::vec3(1.0f, 1.0f, 1.0f));
    boneModel = TranslationMatrix * RotationMatrix * ScalingMatrix;

    std::cout << "bone[" << boneID << "] created.\n";

}

你不需要

assert(this->parent)

在Bone :: hasParent()的第一行中。 聲明某件事意味着您期望它總是真實的。 但是,為什么首先要具有hasParent()函數呢? 當執行此行並且未初始化父對象時,您的程序崩潰。 如果刪除斷言,它應該可以工作。

然后,您也應該在第二個構造函數中初始化parent&child(大概使用nullptr)。

與您的問題無關,但為了改善C ++風格,不應使用#define定義常量。 改用const,例如

const unsigned int NUM_BONES

參見,例如, “靜態常量”與“ #define”與“枚舉”

parent = NULL;
child = NULL;

到第二個構造函數Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)

由@drescherjm解決:

我需要在Bone :: Bone中初始化'parent = NULL'(int ID,glm :: vec3 T,glm :: vec3 R,glm :: vec3 S)

Bone::Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)
{
    parent = NULL;
    boneID = ID;
    isRoot = false;
    pos = T;

    //---------- set boneModel ------------------
    glm::mat4 RotationMatrix = glm::mat4(1.0);
    glm::mat4 TranslationMatrix = translate(glm::mat4(), pos);
    glm::mat4 ScalingMatrix = scale(glm::mat4(), glm::vec3(1.0f, 1.0f, 1.0f));
    boneModel = TranslationMatrix * RotationMatrix * ScalingMatrix;

    std::cout << "bone[" << boneID << "] created.\n";

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM