在另一个对象中创建一个对象会改变'this'

时间:2013-03-14 12:54:08

标签: c++ visual-studio-2012 crash

我有一个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(); 之前, mRenderer 有一些已定义的值,之后, this 更改为完全不同的内容, mRenderer 更改为0x0,这会导致崩溃。可能的原因是什么?

根据评论建议编辑:

完整的init():

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;
}

0 个答案:

没有答案