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都已修正了这些问题。
实例:
?
??
?