美文网首页
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失败抛出异常吗?

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