Размещение массива, новое в сочетании с _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.