龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC6.0中如何让new操作失败后抛出异常?(2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
现在我们用实际代码来测试一下new会不会抛出异常,建一个test.cpp源文件: // test.cpp #include new #include iostream using namespace std; class BigClass { public: BigClass() {

  现在我们用实际代码来测试一下new会不会抛出异常,建一个test.cpp源文件:

// test.cpp
#include <new>
#include <iostream>

using namespace std;

class BigClass
{
 public:
  BigClass() {}
  ~BigClass(){}
  char BigArray[0x7FFFFFFF];
};

int main()
{
 try
 {
  BigClass *p = new BigClass;
 }
 catch( bad_alloc &a)
 {
  cout << "new BigClass, threw a bad_alloc exception" << endl;
 }

 BigClass *q = new(nothrow) BigClass;
 if ( q == NULL )
  cout << "new(nothrow) BigClass, returned a NULL pointer" << endl;
  try
  {
   BigClass *r = new BigClass[1];
  }
  catch( bad_alloc &a)
  {
   cout << "new BigClass[1], threw a bad_alloc exception" << endl;
  }
 return 0;

  根据VC6.0编译器与链接器的做法(请参考《为什么会出现LNK2005"符号已定义"的链接错误?》),链接器会首先在C++标准库中解析符号,然后才是C标准库,所以如果开发者没有自定义operator new的话最后程序链接的应该是C++标准库中newop.obj和newop2.obj模块里的代码。可是程序运行的结果却是:

new(nothrow) BigClass, returned a NULL pointer

  显然程序始终未抛出bad_alloc异常。单步跟踪观察,发现第1个和第3个new实际上调用了new.cpp里的operator new,而第二个new(nothrow)则正确地调用了newop2.cpp定义的版本。很难理解是吧?但是当你用

dumpbin /SYMBOLS libcp.lib

精彩图集

赞助商链接