我有一个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;
}