gpt4 book ai didi

c++ - 标准头文件 中 std::nothrow 和 std::new_handler 的用途是什么

转载 作者:太空狗 更新时间:2023-10-29 20:28:19 28 4
gpt4 key购买 nike

我遇到了一个小的标准头文件 <new> .我以前可能没有看到它的直接使用。这是 the g++ version对于那些有兴趣的人。

下面是我感兴趣的部分:

  struct nothrow_t { };
extern const nothrow_t nothrow;
/** If you write your own error handler to be called by @c new, it must
* be of this type. */
typedef void (*new_handler)();
/// Takes a replacement handler as the argument, returns the previous handler.
new_handler set_new_handler(new_handler) throw();
  1. 如何 struct nothrow_t及其对象 nothrow被程序员使用?是个对象确实需要是 extern
  2. 什么时候new_handler用过吗?
  3. 为什么所有operator new/deleteextern C++ 中声明 block ?

最佳答案

nothrow_t用来告诉operator new在向后兼容的“失败时返回 null 而不是抛出异常”模式下运行。

也就是说,如果您看到这样的代码:

int * idx = new(std::nothrow) int;

那就是 nothrow_t在上类。对于标准中的相关部分,从(从 C++11 N3376 开始)17.6.4.6 [replacement.functions]/1 开始,然后从那里开始。

回答您的具体问题:

  1. 是的,它确实必须是外部的,至少根据 18.6 [support.dynamic]/1,其中包括:

    namespace std {
    class bad_alloc;
    class bad_array_new_length;
    struct nothrow_t {};
    extern const nothrow_t nothrow;
    typedef void (*new_handler)();
    new_handler get_new_handler() noexcept;
    new_handler set_new_handler(new_handler new_p) noexcept;
    }

    此外,17.6.2.3 [using.linkage]/1 说“C++ 标准库中的实体具有外部链接 (3.5)”。函数和类(例如上面的 get_new_handlerset_new_handler)不需要明确注释为具有外部链接,因为它们默认具有外部链接。

  2. new_handler当用户覆盖默认值时使用 operator new通过调用 set_new_handler 使用.它只是一个函数指针类型。

  3. 可能是因为 operator new 的签名在 C 中不保留。 extern "C++"告诉编译器允许对这些函数进行名称修改和其他 C++ 特定的事情。通过这种方式,您可以将一个翻译单元编译为 C,将一个翻译单元编译为 C++,并将它们链接到同一个二进制文件中,而不必担心 C 语言中的某个人定义的函数与编译器的 operator new 冲突。 .

关于c++ - 标准头文件 <new> 中 std::nothrow 和 std::new_handler 的用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13506234/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com