当前位置:编程学习 > C/C++ >>

C++ new 的工作过程


如果申请的是普通的内置类型的空间
1、如果是申请的是0byte,强制转换为1byte
2、使用名为operator new 的标准库函数,如果是数组则调用名为operator new[]的标准库函数,申请相对应的空间,如果没有足够的空间或其他问题且没有定义_new_hanlder,那么会抛出bad_alloc的异常并结束程序
3、如果定义了_new_hanlder回调函数,那么会一直不停的调用这个函数直到问题被解决为止。
4、内存申请成功,返回申请到的内存的首地址。

如果申请的是类的空间
1、如果是申请的是0byte,强制转换为1byte
2、使用名为operator new的标准库函数,如果是数组则调用名为operator new[]的标准库函数,申请相对应的空间,如果没有足够的空间或其他问题且没有定义_new_hanlder,那么会抛出bad_alloc的异常并结束程序
3、如果定义了_new_hanlder回调函数,那么会一直不停的调用这个函数直到问题被解决为止。
4、如果这个类没有定义任何构造函数,析构函数,且编译器没有合成,那么下面的步骤跟申请普通的内置类型是一样的。
5、如果有构造函数或者析构函数,那么会调用一个库函数,具体什么库函数依编译器不同而不同,这个库函数会回调类的构造函数。
6、如果在构造函数中发生异常,那么会释放刚刚申请的空间并返回异常
7、返回申请到的内存的首地址

注意上面的operator new标准库函数跟new表达式的区别!!!!!!
我们可以通过set_new_hanlder去设置_new_hanlder,具体做法如下:
void hanldermemory(){;}
set_new_hanlder(hanldermemory);这只回调函数为hanldermemory
或者set_new_hanlder(NULL);这里没有设置回调函数

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,