为什么删除操作符会导致调试模式中的调试断言失败?

时间:2015-01-10 18:32:14

标签: c++ debugging visual-c++ directx-9

最近我注意到我的引擎绝对没有优化,所以我决定做一些清理工作。在实现了一些剔除算法后,我打开Windows任务管理器,看看我的应用程序使用了多少内存。由于我对“新”和“删除”运算符的简短研究,我试图使用它们来更有效地使用内存。 例如:

void DrawSkybox()
{
p_Device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE );
D3DXVECTOR3* Scal = new D3DXVECTOR3(1.5f, 1.5f, 1.5f);
D3DXVECTOR3* Rot = new D3DXVECTOR3(0, 0, 0);
obj_Skybox->Transform(&vec3_camera_viewPos, Scal, Rot);
DrawObject(p_Device, obj_Skybox, NULL, NULL, NULL, false);
p_Device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE );
delete Scal;
delete Rot;
}

我第一次编译并执行Engine的调试版本时收到错误:“Debug Assertion Failed”。然后我编译并执行了我的引擎作为发布 - 一切都很好。那么问题是什么?

1 个答案:

答案 0 :(得分:0)

您最好以这种方式重构代码,而不是为newdelete而烦恼:

void DrawSkybox() {
     p_Device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE );
     D3DXVECTOR3 Scal(1.5f, 1.5f, 1.5f); // <<<< Just use stack 
     D3DXVECTOR3 Rot (0, 0, 0);          // <<<< allocated variables ...
     obj_Skybox->Transform(&vec3_camera_viewPos, &Scal, &Rot); // <<< ... and pass 
                                                               // their addresses
     DrawObject(p_Device, obj_Skybox, NULL, NULL, NULL, false);
     p_Device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE );
}

我无法详细说明您获得的实际断言失败的详细信息,但它仅在调试模式下出现,并且发布模式编译的代码不会注意到正在发生的事情。
这些错误似乎源于其他地方代码中的不同之处,但不应仅仅引入delete语句。