【问题标题】:Difference between global non-throwing ::operator new and std::malloc全局非抛出 ::operator new 和 std::malloc 之间的区别
【发布时间】:2014-06-09 21:23:52
【问题描述】:

C++ 有几个获取动态存储的函数,其中大部分在某些基本方面有所不同。操作系统通常会添加更多。

其中两个因其可移植性和相似性而受到特别关注:malloc::operator new

全局 void* operator new(size_t, ::std::nothrow&)void* malloc(size_t) 之间是否有任何区别(w.r.t. 标准和实现)?

由于我所说的似乎有些混乱,请考虑以下两个调用:

void* p = ::std::malloc(10);
void* q = ::operator new(10, ::std::nothrow);

明显和微不足道的区别是如何释放内存:

::std::free(p);
::operator delete(q);

注意:这个问题不是重复的,例如What is the difference between new/delete and malloc/free? 因为它谈到了使用 global operator new 实际上不执行任何 ctor 调用。

【问题讨论】:

    标签: c++ c++11 memory-management malloc new-operator


    【解决方案1】:

    除了语法和freedelete 之外,主要区别是

    1. 你可以随身携带replace::operator new
    2. malloc 带有 reallocnew 没有对应的;
    3. new 具有 new_handler 的概念,没有 malloc 等效项。

    (替换malloc 会打开can of worms。它可以完成,但不可移植,因为它需要链接器的知识。)

    【讨论】:

    • 呵呵,这样替换::operator new很时髦
    • 一些研究表明,C++03 已经包含了 new_handler 的概念(§18.4.2),它只针对 C++11 进行了扩展
    • (4) malloc 将失败报告为空指针结果,operator new 通过异常报告失败,(5) malloc 由用户代码直接调用,operator new 通常通过间接调用一个类似事务的 new 表达式,它结合了分配和初始化。
    • @Cheersandhth.-Alf 问题是关于不抛出的new
    【解决方案2】:

    我能想到两个不同点:

    1. 必须使用哪个函数来释放内存,operator deletefree()

    2. C++ 程序可以合法地提供自己的::operator new 版本,并且该版本保证被new 表达式调用。无法用您自己的版本覆盖 malloc

    【讨论】:

    • 据我所知malloc 是一个弱符号,也就是说,你可以覆盖它。
    • @Zaffy 这完全取决于实现(编译器和标准库,在这种情况下也是链接器)。就标准的、可移植的 C++ 而言,这是不可能的。
    【解决方案3】:

    在没有进一步研究的情况下我可以看到的宏观差异是,如果无法完成分配,全局 ::new 运算符的抛出变量将抛出 std::bad_alloc,而 malloc 返回 NULL。但我确实相信here 列出的大部分差异都适用于全局::new 运算符,即使主题是关于new

    【讨论】:

    • 看看以::std::nothrow&作为第二个参数的新版本
    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2021-05-23
    • 2010-10-31
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多