我有一个 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();之前 ,this和mRenderer有一些定义的值,之后,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;
}