C++ allocator::allocate 是不是应该抛出?

Posted

技术标签:

【中文标题】C++ allocator::allocate 是不是应该抛出?【英文标题】:Should C++ allocator::allocate throw or not?C++ allocator::allocate 是否应该抛出? 【发布时间】:2018-05-13 03:28:33 【问题描述】:

Allocator concept 和 std::allocator_traits 并没有说明allocate 是否会抛出。

那么当我使用分配器编写容器时,如何知道是检查返回类型还是使用catch

【问题讨论】:

【参考方案1】:

您参考的页面的要求部分中的表格提供了足够的信息,什么时候可以抛出异常,什么时候不能抛出异常。下面是分配器可能抛出异常时的引用。

a.allocate(n) 分配适合T 类型的 n 个对象的存储空间,但不构造它们。可能会抛出异常。

那里没有描述抛出什么类型的异常,并且可能取决于实现。在 STL 中一般为std::bad_alloc

【讨论】:

【参考方案2】:

是的,它可能会抛出。例外是std::bad_alloc,因为它使用传递给它的allocator,而std::allocator 将抛出std::bad_alloc

在你引用的页面中介绍了两种情况:

    调用 a.allocate(n) 另外传递内存位置提示提示。如果可能,调用 a.allocate(n, hint)。如果不可能(例如 a 没有两个参数的成员函数 allocate()),则调用 a.allocate(n)

所以基本上你可以转向这个:

http://en.cppreference.com/w/cpp/memory/allocator/allocate

【讨论】:

以上是关于C++ allocator::allocate 是不是应该抛出?的主要内容,如果未能解决你的问题,请参考以下文章

提供模板类的一种方法的定义

如何识别项目是托管 c++ 项目还是非托管 c++ 项目

C++ 之父:C++ 是一切的无形基础,透露编程语言生存 40 年秘诀

visual c++是啥?

c++对象模型是什么,对象的内存布局和结构问题

C++有几种,是否有微软的,还有borland c++和c++ builder?还有没有别的,哪些是淘汰了的?