C++规范(ISO/IEC 14882:2011 + ISO/IEC 14882:2014)在表28中定义了释放内存的分配器要求,其中规定:
在调用此函数之前,指向 p 的区域中的所有 n 个 T 对象都应该被销毁。n 应该与 allocate 函数传递以获取此内存的值匹配。不会抛出异常。
但为什么 deallocate 仍然不是 noexcept?
noexcept
函数调用另一个不是noexcept
的函数时,编译器必须添加额外的代码来调用terminate()
以防异常发生。而那些会执行deallocate
(例如析构函数)的东西通常被标记为noexcept
。因此,没有必要装饰deallocate
会导致代码膨胀。LLVM的libc++中的deallocate
是noexcept
的。这是一种符合规范的扩展,下面是如何编写缺陷报告以使其成为必需品:http://cplusplus.github.io/LWG/lwg-active.html#submit_issue - Howard Hinnant