С++ позволяет динамически распределять массивы нулевого размера:
int* p = new int[0];
delete[] p;
Я не могу много сделать с таким указателем (поскольку у массива нет элементов), но новое выражение требуется, чтобы вернуть верный (!= nullptr
) указатель, который затем мне нужно delete[]
снова как если это был фактический массив.
Существуют ли какие-либо требования относительно выравнивания памяти, возвращаемой таким новым выражением? Рассмотрим:
struct alignas(8) Foo {
int x;
};
Foo* p = new Foo[0];
delete[] p;
Может ли p
указывать на 8-выровненный адрес? Более того, если я пишу пользовательский распределитель, мне нужно вернуть указатели на выровненные адреса в таком случае?