1 为什么我们一直强调不能使用返回错误值的方法来代替异常处理?
看这个例子:
int add(int a, int b)
{
return a+b;
}
在这里, 我们无法用返回错误值的方法来表示错误. 因为我们无法分辨返回的值是正确计算的结果还是错误码.
2 在判断new是否成功时, 我们究竟是用返回值为null来判断还是用std::bad_alloc异常来判断? 当new无法成功分配内存时, 它会即返回null又抛出std::bad_alloc吗? 不会的. 它们或者返回空值, 或者抛出std::bad_alloc. 关于究竟如何对new进行管理, 我参考国下面链接中的文章. http://bytes.com/topic/c/answers/470836-new-bad_alloc-null, 看来看去, 还是没有一个明确的答案, 看来要得到正确还得要自己动手做实验, 我们用下面的代码分别在vc6和vs 2008下运行, 看看能得到什么结果
#include "stdafx.h"
// newexcp.cpp -- the bad_alloc exception
#include <iostream>
using namespace std;
#include <new>
#include <cstdlib>
struct Big
{
double stuff[2000];
};
int main(int argc, char* argv[])
{
Big * pb;
try {
cout << "Trying to get a big block of memory:/n";
pb = new Big[100000];
cout << "Got past the new request:/n";
}
catch (bad_alloc & ba)
{
cout << "Caught the exception!/n";
// cout << ba.what() << endl;
exit(1);
}
if (pb != 0)
{
pb[0].stuff[0] = 4;
cout << "success" << endl;
}
else
cout << "pb is null pointer/n";
delete [] pb;
return 0;
}
在vc6下, 不会抛出异常, 而是返回空值.
在vs2008下, 会抛出异常, 不会返回空值.
如果我们将pb = new Big[100000];
改为pb = new(std::nothrow) Big[100000];
那么将会返回空值, 而不会抛出异常.
3 int add(int a, int b) throw(string ) 代表着该函数会抛出一个string异常.
int add(int a, int b) throw() 代表着该函数不会抛出任何异常.
那么int add(int a, int b) 代表什么? 也是不抛出异常吗?如果是这样的话, throw()岂不是多此一举吗?