设为首页 加入收藏

TOP

C++ new 的工作过程
2014-11-23 17:55:22 来源: 作者: 【 】 浏览:6
Tags: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);这里没有设置回调函数

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Coding Interview 8.2 下一篇JNA 中的unsigned 类型映射

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·About - Redis (2025-12-26 08:20:56)
·Redis: A Comprehens (2025-12-26 08:20:53)
·Redis - The Real-ti (2025-12-26 08:20:50)
·Bash 脚本教程——Li (2025-12-26 07:53:35)
·实战篇!Linux shell (2025-12-26 07:53:32)