如果在申请动态内存时找不到足够大的连续字节内存块,malloc()和new()会使用不同的方式宣告内存申请失败,通常有如下几种方式处理“内存耗尽”问题:
1. 判断指针是否为NULL,如果是则立刻用return语句终止本函数。例如:
Void Func(void)
{
A *a=new(nothrow) A;
If(a==NULL)return;
……
}
2. 判断指针是否为NULL,如果是则立刻用exit(1)终止整个程序的运行,例如:
Void Func(void)
{
A *a=new(nothrow) A;
If(a==NULL)exit(1);
}
3. 为new和malloc()预设异常处理函数,例如,Visual C++可以用_set_new_hander函数为new设置用户自定义异常处理函数,也可以让malloc()享用与new相同的异常处理函数。
4. 捕获new抛出的异常,并尝试从中恢复。
上述(1)和(2)两种方式使用最普通。如果一个函数内有多处需要动态申请内存,那么方式(1)就显得力不从心,应该用方式(2)来处理。不过在C++中我们提倡使用方式(4)。
有一个很重要的现象要告诉大家:
对于32位以上的应用程序而言,一般情况下使用malloc()和new几乎不可能导致‘内存耗尽’。我在windows98下用Visual C++编写了测试程序:
这个程序无休地运行下去,根本不会终止,因为32位操作系统支持‘虚存’,内存用完了,自动用硬件空间顶替。
Void main()
{
Int *p=NULL;
Unsigned int len=1024*1024;
While(1){
P=new(nothrow) int[len]; //或者 malloc(sizeof(int)*len);
If(!p){
Len>>=1; //len缩小一半
If(len==0)
Exit(1);
Continue;
}
Cout<<“Allocated:”<<“(len*sizeof(int))”<<“bytes.”<<endl;
}
}
可以得出一个结论:
对于32位以上应用程序,内存耗尽错误处理程序几乎毫无用处,但是必须强调不加错误处理将导致程序的质量很差,千万不可因小失大。