Однако я думаю, что мое решение можно упростить, используя эта подпись:
Код: Выделить всё
void* operator new[]( std::size_t count, std::align_val_t al );
Код: Выделить всё
T *p = new(std::align_val_t(alignof(T))) T[N];
Ожидаемые подписи могут быть:
Код: Выделить всё
void operator delete[]( void* ptr,std::align_val_t al ) noexcept;
void operator delete[]( void* ptr, std::size_t sz,std::align_val_t al ) noexcept;
Код: Выделить всё
// sanitizer: new-delete-type-mismatch
delete[] (N * sizeof(N), std::align_val_t{alignof(Int)}, p);
// sanitizer: new-delete-type-mismatch
delete[] (std::align_val_t{alignof(Int)}, p);
//error: type 'enum class std::align_val_t' argument given to 'delete', expected pointer
delete[] (p, N * sizeof(N), std::align_val_t{alignof(Int)});
//error: type 'enum class std::align_val_t' argument given to 'delete', expected pointer
delete[] (p, std::align_val_t{alignof(Int)});
//error: type 'enum class std::align_val_t' argument given to 'delete', expected pointer
// sanitizer attempting free on address which was not malloc()-ed
::operator delete[](p, std::align_val_t{alignof(Int)});
// sanitizer attempting free on address which was not malloc()-ed
::operator delete[](p, N * sizeof(N), std::align_val_t{alignof(Int)});
Примечание: msvc не может скомпилироваться для всех из них.
Что такое правильный способ использования версии массива new/delete с std::align_val_t?
NB. Как вызвать оператор new[]/delete[] с выровненной памятью кажется дублем, но ошибка, которую получает операция, не та же самая, и, похоже, нет правильного ответа.
Как правильно вызвать выровненный новый/удалить?, и особенно этот ответ не решает мою проблему (я проверил связанный ответ, что привело к жалобе на дезинфицирующее средство)
Подробнее здесь: https://stackoverflow.com/questions/786 ... ith-stdali