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

用户名

最近,我注意到我的引擎绝对未优化,因此我决定进行一些清理。在实现了某些筛选算法之后,我打开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;
}

在我第一次编译并执行Engine的调试版本时,我收到一个错误:“调试断言失败”。然后,我作为发行版编译并执行了我的引擎-一切都很好。那是什么问题呢?

一切都在流动

您最好应该以这种方式重构您的代码,而不要费心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语句。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的 VBA 程序有时会在调试模式下停止?

为什么我可以在调试模式下添加但不能删除 Dim 语句?

如何在调试模式下绕过断言的断言?

调试断言失败错误

错误调试断言失败

调试断言失败

调试断言失败CDialog

调试断言失败,列表

为什么在调试模式下获得不同的值?

为什么在发布模式下进行调试会隐藏信息?

为什么不正确地分配给缓冲区的内存仅在发布模式下而不在调试模式下编译时才导致崩溃?

为什么在运行代码时出现调试断言失败错误

为什么在没有操作符地址的情况下使用函数指针?

XUnit 在 Visual Studio 的调试模式下断言异常

在无调试模式下运行时是否跳过断言?

为什么RakNet的SetNetworkID导致断言失败?

调试断言失败密码检查

STL排序-调试断言失败

应用程序不会在调试模式下启动

为什么WildFly在Intellij IDEA的调试模式下抛出异常,而运行模式却运行良好?

为什么我的重载<<操作符不起作用?

为什么PyCharm在调试模式下会显示“无法显示框架变量”?

为什么PyCharm无法在调试模式下显示PyTorch Module对象属性

为什么在调试模式下访问大型结构向量的元素比访问较小的元素要慢?

为什么我不能为变量分配在调试模式下可以看到的JSON值?

为什么在调试模式下,opencv imshow()创建一个与namedWindow()同名的新窗口?

仅在没有调试模式下,angularJS中的$ http.post才会出错。在调试模式下,它可以正常工作。为什么?

为什么使用__LINE__的此代码在MSVC下以发布模式而不是在调试模式下进行编译?

tutorials_example_trainer在调试模式下失败(-c dbg)