Правильное удаление динамически выделенного простого массива, выделенного с помощью параметра выравнивания `std::align_vC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Правильное удаление динамически выделенного простого массива, выделенного с помощью параметра выравнивания `std::align_v

Сообщение Anonymous »

В качестве ответа на идиому об инициализации std::array с использованием функции-генератора, принимающей индекс?, я предложил способ получения правильно выровненного хранилища.
Однако я думаю, что мое решение можно упростить, используя эта подпись:

Код: Выделить всё

void* operator new[]( std::size_t count, std::align_val_t al );
Который я использую для некоторого типа T, например:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»