【问题标题】:Can't access an object pointer even though its hasnt been deleted [closed]即使尚未删除对象指针,也无法访问它[关闭]
【发布时间】:2014-08-19 16:32:32
【问题描述】:

我的程序每次到达render(Mesh* mesh) 函数时都会崩溃,如果我只有一个std::cout,它可以正常工作,但当我尝试访问RenderingEngine 类中的指针时不会。我已经将couts 放在相机和窗口的析构函数中并且它们没有被调用,并且渲染函数仅在 RenderingEngine 被构造之后才被调用,所以我不确定为什么它不会让我访问指针

它给我的错误是:

GameCreatorEngine.exe 中 0x0101F722 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。

#include "RenderingEngine.h"
#include "ShaderManager.h"
#include "Camera.h"
#include "Mesh.h"


#include <iostream>
using namespace std;

RenderingEngine::RenderingEngine(WindowEngine* window)
{
    this->window = window;
    main_camera = new Camera(window->getWidth() / window->getHeight(), 100.0f, 0.1f, 1000.0f);
    shaders     = new ShaderManager();
    bound_program = shaders->getProgram(shaders->DEFAULT);
    window->setCursorVisability(false);

    cout << "renderer created" << endl;
}


RenderingEngine::~RenderingEngine()
{
    delete main_camera;
    delete shaders;
    delete window;

    cout << "renderer deleted" << endl;
}

void RenderingEngine::setCamera(Camera* camera)
{
    main_camera = camera;
}

ShaderProgram* RenderingEngine::getBoundProgram()
{
    return bound_program;
}

void RenderingEngine::render(Mesh* mesh)
{
    if (main_camera == nullptr) // crashes
    {
        cout << "weeeeeeeeeeeeeyl" << endl;
    } 

    main_camera->print(); // crashes

    window->clearScreen(); // crashes

    window->swapBuffer(); // crashes

    cout << "WHY IS THIS WORKING" << endl; // works

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // WORKS


}

void RenderingEngine::render(ShaderProgram* program, Mesh* mesh)
{
    window->clearScreen();
    {
        glUseProgram(program->getProgramID());
        glBindVertexArray(*mesh->getVAO_ID());

        glEnableVertexAttribArray(0);
        glEnableVertexAttribArray(1);
        glEnableVertexAttribArray(2);
        {
            main_camera->update(window);
            program->addUniform4m("mvp", main_camera->getModelViewProjection(main_camera->getTransformationMatrix()));

            glDrawElements(GL_TRIANGLES, *mesh->getIndicesCount(), GL_UNSIGNED_INT, 0);
        }
        glDisableVertexAttribArray(0);
        glDisableVertexAttribArray(1);
        glDisableVertexAttribArray(2);

        glBindVertexArray(0);
        glUseProgram(0);
    }
    window->swapBuffer();
}

-

#pragma once
#include <glew.h>
#include "GameObject.h"

class Mesh;
class Camera;
class ShaderManager;
class ShaderProgram;
class WindowEngine;

class RenderingEngine
{
public:
    RenderingEngine(WindowEngine* window);
    ~RenderingEngine();

    void setCamera(Camera* cam);
    ShaderProgram* getBoundProgram();

    void render(Mesh* mesh);
    void render(ShaderProgram* program, Mesh* mesh);

private:
    Camera* main_camera;
    WindowEngine* window;

    ShaderManager* shaders;
    ShaderProgram* bound_program;
};

【问题讨论】:

  • 可能是因为您要删除 window,而您并不拥有它。此外,如果您复制或分配RenderingEngine,所有内容都会崩溃。想想当你复制或赋值时指针会发生什么。
  • 我在窗口析构函数中添加了一个 cout 并且它没有被调用
  • 您没有展示任何实际运行可能崩溃的代码,更不用说打印到标准输出了。

标签: c++ opengl visual-c++ c++11 crash


【解决方案1】:

如果它在if (main_camera == nullptr) // crashes 上崩溃,那是因为“this”为空。

【讨论】:

    【解决方案2】:

    看起来你的 RenderingEngine 指针是 nullptr

    【讨论】:

      【解决方案3】:

      看起来我想念这个->出去

      void GameObject::setRenderingEngine(RenderingEngine* renderer) 
      {
              renderer = renderer; // assigning to self
      }
      

      【讨论】:

        猜你喜欢
        • 2014-06-03
        • 1970-01-01
        • 2013-06-01
        • 2013-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-11
        • 1970-01-01
        相关资源
        最近更新 更多