尽管没有定义<new>标头,但新抛出bad_alloc?

Ser*_*uin 5 c++ bad-alloc c++11

如果没有(因为标题中定义了这个错误),new程序中的表达式如何抛出错误怎么回事?bad_alloc#include <new><new>

从3.7.4开始.N3337:

该库提供全局分配和释放功能的默认定义.一些全局分配和释放功能是可替换的(18.6.1).C++程序最多只能提供一个可替换分配或释放功能的定义.任何此类函数定义都将替换库中提供的默认版本(17.6.4.6).以下分配和释放函数(18.6)在程序的每个转换单元中在全局范围中隐式声明.

void* operator new(std::size_t);

void* operator new[](std::size_t);

void operator delete(void*);

void operator delete[](void*);
Run Code Online (Sandbox Code Playgroud)

这些隐含的声明只介绍了函数名operator new,operator new[],operator delete,和operator delete[].[ 注:隐式声明不引入名称std,std::size_t或该库使用来声明这些名称的任何其他名称.因此,在不包括头部的情况下引用这些函数之一的新表达式,删除表达式或函数调用<new>是格式良好的.但是,除非通过包含适当的标题声明了名称,否则引用stdstd::size_t形成不良.-end note ]也可以为任何类声明和定义分配和/或释放函数

这仍然不清楚.隐式声明使用std::size_t但不引入它们(同样必须是这样bad_alloc)?并且std::size_tnew表达式可以使用之前不需要引入?可以理解这是怎么回事,或者我必须从表面上看它?

And*_*tur 4

您的引述说这些全局函数存在并且按照描述隐式声明。因此,当您调用 时new,将调用标准库中的全局函数。全局函数的实现new是抛出 的一个,并且该实现在编译时std::bad_alloc可以访问,因此知道如何抛出。您的代码不需要知道 a是什么,除非您试图捕获它。但除了捕获它之外,这就像您从其他库中调用任何其他函数一样,这些函数可能会抛出一些任意异常。除非您试图捕获该异常,否则您不需要了解该异常的详细信息,但这并不能阻止被调用者抛出该异常。<new>std::bad_allocstd::bad_alloc