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