首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

采用new分配内存失败时为什么会出现两种异常报告方式

2012-10-18 
采用new分配内存失败时为什么会出现两种错误报告方式?在c语言中,我们经常会使用new给一个对象分配内存空间

采用new分配内存失败时为什么会出现两种错误报告方式?

        在c++语言中,我们经常会使用new给一个对象分配内存空间,而当内存不够会出现内存不足的情况。c++提供了两中报告方式:

        1.抛出bad_alloc异常来报告分配失败;

        2.返回空指针,而不会抛出异常。

        c++为什么会采用这两种方式呢?这主要是由于各大编译器公司设计c++编译器公司的结果,因为标准c++是提供了异常机制的。例如,vc++6.0中当new分配内存失败时会返回空指针,而不会抛出异常。而gcc的编译器对于c++标准支持比较好,所以当new分配内存失败时会抛出异常。

       究竟为什么会出现这种情况呢?

       首先,c++是在c语言的基础之上发展而来,而且c++发明时是想尽可能的与c语言兼容。而c语言是一种没有异常机制的语言,所以c++应该会提供一种没有异常机制的new分配内存失败报告机制;(确实是如此,早期的c++还没有加入异常机制)

       其次在返回空指针的实现过程中,c++采用的是malloc/calloc 等分配内存的函数,该类函数不会抛出异常,但是在分配内存失败时会返回“空指针”。

       最后,对于标准的c++,有着比较完善的异常处理机制,所以对于出现异常时,会抛出响应的异常。对于new分配失败时,系统会抛出bad_alloc异常。

       鉴于以上原因,我们在不同的编译器需要new分配失败时做不同的处理。例如:

情况1:

int main(){       set_new_handler(nomorememory);       int *pArray = new int[100000000000000L];...}

当operator new无法分配足够空间时,noMemoryToAlloc就会被调用,于是程序就会发出一个错误信息cerr之后,调用abort函数结束程序。

如果operator new无法分配足够空间时,我们希望不断调用new-handler函数,直到找到足够内存为止,那么我们的operator new函数就可以设计为:

void *operator new(std::size_t size) throw(std::bad_alloc)

{

        if ( size==0 ) {

             size  = 1;

        }

       while (true) {

            调用malloc等内存分配函数来尝试分配size大小的内存;

            if ( 分配成功 )

                 return 指向分配得来的内存指针;

            new_handler globalHandler  = set_new_handler(0);

            set_new_handle(globalHandler);

            if(globalHandler)

                   (*globalHandler)();

           else

                   throw std::bad_alloc();

       }

}

      


热点排行