在另一个对象内创建对象会更改';这'; 我有C++类ReNeReuleWIDGET,它有一个In()方法。在使用Visual Studio 2012编译并运行它之后,我在一个非常奇怪的位置发生了崩溃: bool RendererWidget::init(Renderer *renderer) { /* ... */ mRenderer = renderer; mViewport = new Viewport(); return mRenderer->init(mViewport); }
函数被传递给一个非nullptr渲染器,然后创建一个视口对象,该对象具有一个简单的构造函数。问题是在mViewport=newviewport()之前;,this和mRenderer有一些定义的值,之后,这将更改为完全不同的值,mRenderer将更改为0x0,这将导致稍后的崩溃。可能的原因是什么 根据评论建议进行编辑: 完全初始化():在另一个对象内创建对象会更改';这'; 我有C++类ReNeReuleWIDGET,它有一个In()方法。在使用Visual Studio 2012编译并运行它之后,我在一个非常奇怪的位置发生了崩溃: bool RendererWidget::init(Renderer *renderer) { /* ... */ mRenderer = renderer; mViewport = new Viewport(); return mRenderer->init(mViewport); },c++,visual-studio-2012,crash,C++,Visual Studio 2012,Crash,函数被传递给一个非nullptr渲染器,然后创建一个视口对象,该对象具有一个简单的构造函数。问题是在mViewport=newviewport()之前;,this和mRenderer有一些定义的值,之后,这将更改为完全不同的值,mRenderer将更改为0x0,这将导致稍后的崩溃。可能的原因是什么 根据评论建议进行编辑: 完全初始化(): 向我们展示您在调试模式下编译的“一些定义值”?这通常发生在发布模式中,我指的是有效的、非空的PTR地址。我是在调试模式下编译的。问题在于您没有向我们展示的代码
向我们展示您在调试模式下编译的“一些定义值”?这通常发生在发布模式中,我指的是有效的、非空的PTR地址。我是在调试模式下编译的。问题在于您没有向我们展示的代码。两个词:堆损坏。
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;
}