Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
341 views
in Technique[技术] by (71.8m points)

std - Should C++ allocator::allocate throw or return nullptr when allocation fails?

The Allocator concept and std::allocator_traits do not say what allocate will do when allocation fail -- will it returns nullptr or throw?

When I'm writing a container using standard allocator API, should I

  1. Check the return value and catch the exception in the noexcept version member function(E.g. push_back, resize...);

  2. Check the return value and throw if fail in the exception-throwing one

so that no matter it throws or not, I will get the correct behavior.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Draft n4659 for C++ standard says at 23.10.9 The default allocator [default.allocator] (emphasize mine):

23.10.9.1 allocator members [allocator.members]
...

T* allocate(size_t n);

2 Returns: A pointer to the initial element of an array of storage of size n * sizeof(T), aligned appropriately for objects of type T.
3 Remarks: the storage is obtained by calling ::operator new (21.6.2), but it is unspecified when or how often this function is called.
4 Throws: bad_alloc if the storage cannot be obtained.

It makes it clear that the standard allocator will raise a bad_alloc exception if it cannot allocate storage.


Above is for the standard allocator. The requirement for any allocator are described in 20.5.3.5 Allocator requirements [allocator.requirements] and table 31 — Allocator requirements contains:

a.allocate(n) [Return type:] X::pointer [Assertion/note/ pre-/post-condition]Memory is allocated for n objects of type T but objects are not constructed. allocate may throw an appropriate exception

My understanding is that allocate can return only when memory has been allocated. So the allocator should throw an appropriate exception (not necessarily bad_alloc even if it would be quite appropriate) if memory could not be allocated.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...