0

init()メソッドを持つ C++ クラスRendererWidgetがあります。Visual Studio 2012 でコンパイルして実行すると、かなり奇妙な場所でクラッシュが発生します。

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

  return mRenderer->init(mViewport);
}

この関数には、nullptr 以外のレンダラーが渡され、自明なコンストラクタを持つViewportオブジェクトが作成されます。問題は、mViewport = new Viewport();の前にあることです。これmRendererにはいくつかの定義済みの値があり、その後、これはまったく異なるものに変更され、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;
}
4

0 に答える 0