【发布时间】:2016-01-19 15:54:06
【问题描述】:
程序中的new 表达式怎么会抛出bad_alloc 错误,尽管没有#include <new>(因为这个错误is defined in the <new> header)?
从 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*);这些隐式声明仅引入函数名称
operator new、operator new[]、operator delete和operator delete[]。 [ 注意:隐式声明不引入名称std、std::size_t,或库用来声明这些名称的任何其他名称。因此,一个新的表达, 引用这些函数之一但不包括标题<new>的删除表达式或函数调用是格式正确的。但是,引用std或std::size_t是不正确的,除非已通过包含适当的标头来声明名称。 —尾注 ] 分配和/或释放函数也可以为任何类声明和定义
这对我来说仍然不清楚。隐式声明使用std::size_t 但不引入它们(bad_alloc 也必须如此)?并且std::size_t不需要在使用new表达式之前引入?可以理解这是怎么回事,还是我必须从表面上看?
【问题讨论】:
-
嗯,您正在链接标准 C++ 库,其中确实包含
<new>,因此知道std::bad_alloc。 -
可能与官方允许 C++ 标准头文件包含任何其他 C++ 标准头文件这一事实有关,但我想就这些函数而言,这还不是全部。跨度>
-
经过一番实验,我得出结论,其实是这样的。我会写一个关于它的答案。