polymorphic_allocator::allocate does not satisfy Cpp17Allocator requirements
Alisdair Meredith

Created on 2020-07-27.00:00:00 last changed 3 weeks ago


Date: 2021-05-21.01:30:39

Proposed resolution:

This wording is relative to N4885.

  1. Modify [mem.res.public] as indicated:

    [[nodiscard]] void* allocate(size_t bytes, size_t alignment = max_align);

    -2- Effects: Equivalent to: return Allocates storage by calling do_allocate(bytes, alignment); and implicitly creates objects within the allocated region of storage.

    -?- Returns: A pointer to a suitable created object ([intro.object]) in the allocated region of storage.

    -?- Throws: What and when the call to do_allocate throws.

Date: 2021-05-20.00:00:00

[ 2021-05-20 Tim comments and updates wording ]

memory_resource::allocate is the PMR equivalent of malloc and operator new. It therefore needs the "suitable created object" wording (see [intro.object], [c.malloc]). This ensures that it creates the requisite array object automatically for all the allocation functions of polymorphic_allocator, and returns the correct pointer value in all cases.

Date: 2020-08-15.00:00:00

[ 2020-08-21; Reflector prioritization ]

Set priority to 3 after reflector discussions.

Previous resolution [SUPERSEDED]:

This wording is relative to N4861.

[Drafting note: The proposed wording is inspired by the example given in the "Assertion/note" column of the expression a.allocate(n) in table [tab:cpp17.allocator].]

  1. Modify [mem.res.public] as indicated:

    [[nodiscard]] void* allocate(size_t bytes, size_t alignment = max_align);

    -2- Effects: Equivalent to: return do_allocate(bytes, alignment);

    void* p = do_allocate(bytes, alignment);
    return launder(new (p) byte[bytes]);
Date: 2020-08-15.00:00:00

[ 2020-08-03; Billy comments ]

It's worth noting that the resolution of CWG 2382 has impact on implementors for this issue.

Date: 2020-07-27.00:00:00

With the adoption of P0593R6 in Prague, std::ptr::polymorphic_allocator no longer satisfies the of Cpp17Allocator requirements. Specifically, all calls to allocate(n) need to create an object for an array of n Ts (but not initialize any of those elements). std::pmr::polymorphic_allocator calls its underlying memory resource to allocate sufficient bytes of storage, but it does not create (and start the lifetime of) the array object within that storage.

Date User Action Args
2021-05-21 01:30:39adminsetmessages: + msg11832
2020-08-21 13:34:21adminsetmessages: + msg11438
2020-08-03 19:47:49adminsetmessages: + msg11431
2020-08-02 17:02:36adminsetmessages: + msg11425
2020-07-27 00:00:00admincreate