CWG Issue 2470 (original) (raw)
This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 117a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2025-04-13
2470. Multiple array objects providing storage for one object
Section: 6.7.2 [intro.object]Status: CD6Submitter: Andrey ErokhinDate: 2021-01-29
According to 6.7.2 [intro.object] paragraph 3,
If a complete object is created (7.6.2.8 [expr.new]) in storage associated with another object e of type “array of N unsigned char” or of type “array of N std::byte” (17.2.1 [cstddef.syn]), that array provides storage for the created object if:
- the lifetime of e has begun and not ended, and
- the storage for the new object fits entirely within e, and
- there is no smaller array object that satisfies these constraints.
The intent of the third bullet is to select a unique array object among those satisfying the first two bullets. However, it is possible to have multiple array objects of the same size satisfying the first two bullets. For example:
unsigned char buffer[8]; struct OhNo { std::byte data[8]; }; static_assert(sizeof(OhNo) == 8 && sizeof(int) == 4); OhNo *p = new (buffer) OhNo; // buffer provides storage for OhNo int *q = new (p->data) int; // who provides storage for this? int *r = new (buffer + 4) int; // who provides storage for this?
Suggested resolution:
Change 6.7.2 [intro.object] bullet 3.3 as follows:
- there is no
smallerarray object that satisfies these constraints nested within e.
Proposed resolution (February, 2021):
Change 6.7.2 [intro.object] bullet 3.3 as follows:
- there is no
smallerarray object that satisfies these constraints nested within e.