主题 : 内存耗尽怎么办? 复制链接 | 浏览器收藏 | 打印
arm9之家,加油!一起加油!
级别: 新手上路
UID: 74373
精华: 0
发帖: 24
金钱: 130 两
威望: 26 点
贡献值: 0 点
综合积分: 48 分
注册时间: 2012-07-23
最后登录: 2012-09-27
楼主  发表于: 2012-08-21 10:04

 内存耗尽怎么办?

如果在申请动态内存时找不到足够大的连续字节内存块,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位以上应用程序,内存耗尽错误处理程序几乎毫无用处,但是必须强调不加错误处理将导致程序的质量很差,千万不可因小失大。
来自:嵌入式培训 http://www.lirenedu.org/index.php?ack=xinwen&id=297
嵌入式培训 http://www.lirenedu.org/