尽管没有定义标题,但新的抛出bad_alloc <new> ?
New throws bad_alloc despite <new> header not being defined?
没有#include <new>
,程序中的new
表达式如何抛出bad_alloc
错误(因为此错误是在<new>
标头中定义的)?
从 N3337 的 3.7.4. 开始:
该库为全局分配和解除分配函数提供默认定义。某些全局分配和取消分配函数是可替换的 (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
也必须如此)?在使用new
表达式之前不需要引入std::size_t
?这有什么意义吗,还是我必须从表面上看?
你的引文说这些全局函数存在,并且如上所述隐式声明。 因此,当您调用 new
时,将调用标准库中的全局函数。 全局函数new
的实现是抛出std::bad_alloc
的,并且该实现在编译时可以访问<new>
,因此知道如何抛出std::bad_alloc
。 你的代码不需要知道std::bad_alloc
是什么,除非你试图捕捉它。 但除了捕获它之外,这就像您从其他库中调用任何其他函数一样,这些函数可能会引发一些任意异常。 除非您试图捕获该异常,否则您不需要知道该异常的详细信息,但这并不能阻止被调用方抛出它。
名称 std::size_t
只是其他整数类型的 typedef,可能是 unsigned long
或 unsigned long long
。编译器知道new
的真实参数类型,即使名称size_t
不可见。
与bad_alloc
类似.抛出bad_alloc
的运行时代码肯定包含 <new>
标头,即使您的程序不包含。
C++标准标头包含任何其他C++标头。因此,您可以获得对std::bad_alloc
的依赖于实现的访问,而无需包含<new>
,也可以通过包含<cstddef>
等std::size_t
。我懒得在您的标准版本中查找它,但在 N4296 草案中它在 §17.6.5.2 中:
C++标头可能包括其他C++标头。
您可以使用编译器尝试此操作。
int main()
{
std::size_t x; // error
std::bad_alloc y; // error
}
现在让我们添加一个完全不相关的#include
:
#include <complex>
int main()
{
std::size_t x; // probably not an error anymore, depends on compiler
std::bad_alloc y; // probably not an error anymore, depends on compiler
}
- 使用来自 Excel VBA 的 C++ dll 时"Bad DLL calling convention" - 如何解决?
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 组件对象模型 (COM):IMalloc::Alloc 在哪里分配内存?
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 为什么 GetSystemMetrics (SM_CXVIRTUALSCREEN) 返回'bad'值?
- 将 lambda 传递给 STL 集时出错"bad function call"
- 新的 C++14 位分隔符处"Bad Character" Eclipse Oxygen 错误
- 使用 #define 被认为是"bad practice"吗?
- "400 Bad request"使用 OpenSSL BIO 进行请求时
- CGAL:Hausdorff距离不良Alloc
- 解密文件AES_256_CBC返回"bad decrypt"错误
- 在C++流中,eof(),fail(),bad()和good()有什么区别
- C STD ::初始化类对象中的Alloc错误错误
- make / gcc:"bad build"的可能原因是什么?
- 什么是地址0xbaddc0dedeadbead "Bad decode dead bead"
- 在多线程环境中,什么可能导致"bad file descriptor"?
- 尝试解决HackerBank上的BFS挑战时出现错误的alloc异常
- "std::vector"在调整大小时引发"bad allocation"异常
- 尝试使用 execp、dup2 和管道实现 shell,挂起或"bad file descriptor"