当前位置:C++技术网 > 资讯 > 函数内部分析:1 new的内部执行逻辑深入分析

函数内部分析:1 new的内部执行逻辑深入分析

更新时间:2015-06-23 19:50:57浏览次数:1+次

在new内部分配内存有一个循环,可以多次处理内存分配。如果一次失败,还可以进一步处理,然后再分配。


内部执行基本流程如下:
1.内部创建一个void*指针,调用malloc函数分配内存。如果指针不为空,分配成功,则返回指向分配到的内存的指针。
2.如果指针为空,意味着未分配到内存,则需要进一步处理。因此调用new处理函数,获得内存分配异常处理函数指针。然后调用异常处理函数处理异常,如果处理成功,则继续尝试分配。如果分配失败,还是要调用异常处理函数处理。如此循环下去。
3.如果获取的异常处理函数指针为空,则表明没有处理异常的函数,则创建一个static const std::bad_alloc类型的静态异常对象,然后直接抛出这个异常对象。

内存分配异常处理函数中执行的过程:
有一个全局异常处理函数指针,分配内存失败后,会对这个函数指针进行分析,看看是否指向了函数,如果指向了函数,则表明有异常处理;如果为空则表示没有异常处理,那么就抛出异常。异常处理函数指针所指的函数就是异常处理函数,可以自己设置,调用set_new_handler(函数名);设置,而函数的类型就是:void  函数名();如果出现异常,则会调用set_new_handler设置的函数,你可以在这个函数了处理,给出提示等。

分析的大致过程是这样的:
为了检测是否设置了内存分配异常处理函数,在进程中设置一个函数来分析异常处理函数指针,查看其是否有指向。而为了通用,同样也设置一个函数指针,我们暂且称之为“分析函数指针”,用来分析异常处理函数指针的情况,而将处理函数的函数指针称之为“处理函数指针”,用来处理异常。不过,分析函数指针的函数体是由系统提供的,处理函数指针的函数体可以由我们指定,也就是通过set_new_handler指定。在分析前,会先判断线程存储区是否已经缓存了分析函数指针的函数体,如果缓冲了,则直接调用这个函数来分析,如果没有缓冲,则调用GetProcAddress(hKernel32, _DECODE_POINTER);来获取分析函数的函数入口地址赋值给分析函数指针。如果分析函数指针得到正确的值,则指向了正确的分析函数地址,则调用这个函数分析,最后将分析得到的实际的处理函数地址返回。如果没有设置处理函数,则为空。这样的话,就没有处理函数,内存分配失败,且没有处理,则直接抛出异常。