数组放置与_aligned_malloc结合使用,删除的正确方法是什么?

时间:2017-02-24 09:14:29

标签: c++ visual-c++ memory-alignment placement-new

开始尝试放置newdelete以及内存对齐,感觉就像是在papas smurf实验室中显得很聪明。

让我说我有一个对象,例如,

struct obj {
...
};

我希望在对齐存储中分配一个包含N个这类对象的数组。我所做的是:

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

也就是说,我将展示位置new与_aligned_malloc结合使用。

Q

  • 这种分配对齐存储的方式是否正确?
  • 之后是否可以(可能不是)使用delete []解除分配或者我需要一些特殊处理?

P.S 我知道_aligned_malloc不是标准的,而是MVSC特定的。

1 个答案:

答案 0 :(得分:1)

您的任务是否足以使用C ++ 11 alignas

有关delete[] - aligned_malloc ed内存的问题应使用_aligned_free释放。当然你需要先调用析构函数。 Look this answer.

修改

#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;
}

在我的机器上,由于new[]delete[]而不是手动malloc / free,它会创建正确对齐的存储,c-tors和d-tors。