访问冲突读取位置 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";

}

原文由 Claire 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.4k
2 个回答

添加

parent = NULL;
child = NULL;

到第二个构造函数 Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)

原文由 wallycz 发布,翻译遵循 CC BY-SA 3.0 许可协议

你不需要

assert(this->parent)

在 Bone::hasParent() 的第一行。断言某事意味着您希望它始终为真。但是,为什么你首先要有函数 hasParent() 呢?当执行此行并且父级未初始化时,您的程序将崩溃。如果您删除断言,它应该可以工作。

然后你应该在第二个构造函数中初始化父子和子(大概是 nullptr)。

与您的问题无关,但为了改进您的 C++ 风格,您不应该使用#define 来定义常量。改用 const ,例如

const unsigned int NUM_BONES

参见,例如, “static const” vs “#define” vs “enum”

原文由 alex 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题