happem

C基础:内存耗尽怎么办?

 如果在申请动态内存时找不到足够大的连续字节内存块,malloc()new()会使用不同的方式宣告内存申请失败,通常有如下几种方式处理“内存耗尽”问题:

1.         判断指针是否为NULL,如果是则立刻用return语句终止本函数。例如:

Void Func(void)

 {

     A *a=new(nothrow) A

     Ifa==NULLreturn

     ……

}

2.         判断指针是否为NULL,如果是则立刻用exit(1)终止整个程序的运行,例如:

Void Funcvoid

 {

     A *a=new(nothrow) A

     Ifa==NULLexit(1)

}

3.         newmalloc()预设异常处理函数,例如,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

     While1{

        P=new(nothrow) int[len] //或者 malloc(sizeof(int)*len)

         If(!p){

           Len>>=1;                //len缩小一半

         Iflen==0

         Exit(1)

        Continue

}

 Cout<<Allocated:”<<“(len*sizeof(int))”<<bytes.<<endl

}

}

可以得出一个结论:

   对于32位以上应用程序,内存耗尽错误处理程序几乎毫无用处,但是必须强调不加错误处理将导致程序的质量很差,千万不可因小失大。

posted on 2012-08-21 10:03 happem 阅读(401) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理