为什么 delete 运算符会导致 Debug 模式下的 Debug Assertion Fail?
Why does delete operator causes Debug Assertion Fail in Debug Mode?
最近我注意到我的引擎完全没有优化,所以我决定做一些清理工作。实施一些剔除算法后,我打开 Windows 任务管理器以查看我的应用程序使用了多少内存。作为对 "new" 和 "delete" 运算符的简短研究的结果,我尝试使用它们来更有效地使用内存。
例如:
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;
}
在我第一次编译和执行引擎的调试版本时,我收到一个错误:"Debug Assertion Failed"。然后我编译并执行我的引擎作为一个版本——一切都很好。那么问题是什么?
你最好用这种方式重构你的代码,而不是为 new
和 delete
:
而烦恼
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
语句。
最近我注意到我的引擎完全没有优化,所以我决定做一些清理工作。实施一些剔除算法后,我打开 Windows 任务管理器以查看我的应用程序使用了多少内存。作为对 "new" 和 "delete" 运算符的简短研究的结果,我尝试使用它们来更有效地使用内存。 例如:
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;
}
在我第一次编译和执行引擎的调试版本时,我收到一个错误:"Debug Assertion Failed"。然后我编译并执行我的引擎作为一个版本——一切都很好。那么问题是什么?
你最好用这种方式重构你的代码,而不是为 new
和 delete
:
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
语句。