0

我有一个 C++ 类RendererWidget,它有一个init()方法。使用 Visual Studio 2012 编译并运行它后,我在一个非常奇怪的位置发生了崩溃:

bool RendererWidget::init(Renderer *renderer)
{
  /* ... */
  mRenderer = renderer;
  mViewport = new Viewport();

  return mRenderer->init(mViewport);
}

该函数被传递一个非 nullptr 渲染器,然后创建一个Viewport对象,该对象具有一个简单的构造函数。问题是在mViewport = new Viewport();之前 thismRenderer有一些定义的值,之后,this更改为完全不同的值,mRenderer更改为 0x0,这会导致稍后崩溃。可能的原因是什么?

按照评论的建议进行编辑:

完整的初始化():

bool RendererWidget::init(Renderer *renderer)
{
    Engine *engine = Engine::instance();

    if (renderer)
    {
        mRenderer = renderer;
        mOwnsRenderer = false;
    }
    else
    {
        mRenderer = engine->createRenderer();
        if (!mRenderer)
            return false;

        mOwnsRenderer = true;
    }

    mViewport = new Viewport();

    // this and mRenderer are already changed here, mViewport is a valid pointer
    mViewport->initFromOther(reinterpret_cast<HWND>(winId()));

    // crash
    return mRenderer->init(mViewport, engine->getMainRenderer());
}

视口:

Viewport::Viewport()
    : mHandle(NULL)
    , mRenderer(nullptr)
    , mAudio(nullptr)
    , mInput(nullptr)
    , mOwnsHandle(true)
{
}

void Viewport::initFromOther(SystemWndHandle hWnd)
{
    mHandle = hWnd;
    mOwnsHandle = false;
}
4

0 回答 0