1、问题:动态内存申请一定成功吗?
- 常见的动态内存分配代码
- 必须知道的事实
2、问题: new 语句中的异常是怎么抛出来的?
- new 关键字在 C++规范中的标准行为
- new 关键字在C++规范中的标准行为
3、new_handler()
的定义和使用
问题:如何跨编译器 统一 new
的行为,提高代码移植性?
解决方案:
int* p = new(nothrow) int[10];
- 实验结论
— 不是所有的编译器都遵循C++的标准规范
— 编译器可能重定义new
的实现,并在实现中抛出bad_alloc
异常
— 编译器的默认实现中,可能没有设置全局的new_handler()
函数
— 对于移植性要求较高的代码,需要考虑new
的具体细节
小结:
- 不同的编译器在动态内存分配上的实现细节不同
malloc
函数在内存申请失败时返回NULL
new
关键字在内存申请失败时
— 可能返回NULL
值
— 可能抛出bad_alloc