C++ New崩溃原理及解决方法(二)

2015-07-20 17:08:52 ? 作者: ? 浏览: 6
. namespace 05. { 06. int new_handler( size_t ) 07. { 08. throw std::bad_alloc(); 09. return 0; 10. } 11. 12. class NewHandler 13. { 14. public : 15. NewHandler() 16. { 17. m_old_new_handler = _set_new_handler(new_handler); 18. } 19. ~NewHandler() 20. { 21. _set_new_handler(m_old_new_handler); 22. } 23. private : 24. _PNH m_old_new_handler; 25. } g_NewHandler; 26. } // namespace 27.

将以上代码包含进我们的工程,那么new失败时的错误处理会被自动修改,例子中将会抛出std::bad_alloc。

new(std::nothrow)抛出错误

在Visual Studio 6.0中,如果将以上代码包含进去,而分配内存时用new(std::nothrow),运行release时反而会报错,显示Abnormal program termination。这是个比较细节性的问题,是由于编译器的优化造成的。可以到Project Settings | C/C++ | General | Optimizations将优化关掉以避免这个问题,或者还可以自己写一个new(std::nothrow)(请参考源代码NewNoThrow.cpp)。

总结

Visual C++ 6.0默认提供的new操作与STL并不兼容。即使前面提到了一些解决方法,仍有可能在用第三方的库或STL中个别其他函数时会有麻烦。VC 6.0中new、new(std::nothrow)和STL的不相称不能完全的解决掉,但如果不用上面的方法,肯定会有很到的麻烦。

MFC项目中,STL中用new的地方是否能经受异常的考验完全取决于你用的STL中的错误处理时如何写的。大多数都会用catch(…)而不是catch(std::bad_alloc),但这并不是必须的。

最后,正如最开始所提到的,Visual C++ 2005到2010都已修正了这些问题。


实例:

?

?? \

?

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: