美文网首页
new失败抛出异常吗?

new失败抛出异常吗?

作者: RC_HT | 来源:发表于2019-08-06 23:31 被阅读0次

new/delete

在C++中动态分配与释放内存是通过new/delete和new []/delete []实现的。

  • 当new分配内存失败时,默认情况将抛出bad_alloc异常,当然也可以通过传入nothrow_t类型的nothrow对象强制不抛出异常(new (nothrow) T/T []),此时分配内存失败就和malloc失败一样会返回nullptr。
  • delete不抛出异常并且支持删除空指针,即delete nullptr是合法的

operator new/operator delete

当直接调用new/delete时,其实内部执行了好几个步骤,对于new而言,首先是调用某个重载的operator new分配出内存,然后再在该内存构造出对象,最后返回。下面是C++自带的operator new和operator delete函数:

//默认情况下调用的operator new和operator delete
void *operator new(size_t); // allocate an object
void *operator new[](size_t); // allocate an array
void *operator delete(void*) noexcept; // free an object
void *operator delete[](void*) noexcept; // free an array

//传入nothrow参数时调用的operator new和operator delete
void *operator new(size_t, nothrow_t&) noexcept;
void *operator new[](size_t, nothrow_t&) noexcept;
void *operator delete(void*, nothrow_t&) noexcept;
void *operator delete[](void*, nothrow_t&) noexcept;

//该函数用于placement new,由系统保留不能被重载
void *operator new(size_t, void*); // this version may not be redefined

所以new (nothrow) T/T[]的原理就是因为调用了重载函数oprerator new不会抛出异常的版本

placement new

placement new并不会动态分配内存,而是在传入的指针地址处“就地”进行对象的初始化工作。

相关文章

  • new失败抛出异常吗?

    new/delete 在C++中动态分配与释放内存是通过new/delete和new []/delete []实现...

  • new(std::nothrow)

    new(std::nothrow) 顾名思义,即不抛出异常,当new一个对象失败时,默认设置该对象为NULL,这样...

  • 【javase09~异常】

    【部分内容来自网络,侵删】 异常体系 抛出异常 语法:throw new Exception('异常信息'); 声...

  • 强引用、软引用、弱引用、虚引用总结

    强引用:普通new对象的引用 StrongReference jvm宁愿抛出OutOfMemory异常也不会去回收...

  • 【Effective C++(8)】定制new和delete

    49 了解new-handler的行为 operator new抛出异常以反映一个未获满足的内存需求之前,它会先调...

  • Ambari安装hadoop遇到的问题(二)

    5、启动spark,Spark Thrift Server启动失败,抛出异常 问题7:jvm启动失败 ,报-Xlo...

  • TestNG运行结果分析与失败截图功能介绍

    TestNG测试结果 一、成功、失败和断言: 如果一个测试没有抛出任何异常就完成运行或者说抛出了期望的异常 此时,...

  • 异常类

    异常中的关键字1.throw 在方法内部,抛出异常对象2.throw 后面必须写new 对象,对象必须是异常的对象...

  • 异常抛出

    本章主要内容 用try语句捕获异常 常见异常处理 用raise 和assert抛出异常 自定义异常 常用异常名 总...

  • 抛出异常

    在方法执行的时候,遇到不匹配的地方,加入异常抛出机制,可以清晰的知道异常点,并很好的解决。 throw new E...

网友评论

      本文标题:new失败抛出异常吗?

      本文链接:https://www.haomeiwen.com/subject/xligdctx.html