Размещение массива, новое в сочетании с _aligned_malloc, как правильно удалить?

Начали экспериментировать с размещением new а также delete наряду с выравниванием памяти, и это похоже на то, чтобы быть умным смарфом в лаборатории папаша смурфа.

Допустим, у меня есть объект, например,

struct obj {
...
};

и я хочу разместить в выровненном хранилище массив с N такие объекты. Что я делаю, это:

obj *buf = new (static_cast<obj*>(_aligned_malloc(sizeof(obj) * N, 64))) obj[N];

То есть я использую размещение новых в сочетании с _aligned_malloc,

Q

  • Является ли этот способ выделения выровненного хранилища правильным?
  • Это нормально (вероятно, нет), чтобы использовать delete [] чтобы освободить потом или мне нужна особая обработка?

PS я знаю что _aligned_malloc это не стандарт, а скорее спецификация MVSC.

1 ответ

Разве для вашей задачи не достаточно использовать C++ 11 alignas?

По вопросу о delete[] - aligned_mallocпамять должна быть освобождена с помощью _aligned_free, Конечно, сначала нужно вызвать деструктор. Смотри этот ответ.

РЕДАКТИРОВАТЬ:

#include <malloc.h>

__declspec(align(64))
struct obj
{
    int i;
    char c;

    obj() : i{ 1 }, c{ 'a' } {}

    void* operator new[](size_t n)
    {
        return _aligned_malloc(n, 64);
    }

    void operator delete[](void* p)
    {
        _aligned_free(p);
    }
};

int main()
{
    int N = 10;
    obj *buf = new obj[N];

    buf[2].i = 1;

    delete[] buf;
    return 0;
}

На моей машине это создает правильно выровненное хранилище, c-tors и d-tors называются из-за new[] а также delete[] вместо ручного malloc/free.

Другие вопросы по тегам