【问题标题】:Array placement new in combination with _aligned_malloc, what's the proper way to delete?数组放置新结合_aligned_malloc,删除的正确方法是什么?
【发布时间】:2017-02-24 21:21:23
【问题描述】:

开始尝试放置 newdelete 以及内存对齐,感觉就像是爸爸蓝精灵实验室里的聪明蓝精灵。

假设我有一个对象,例如,

struct obj {
...
};

我想在对齐的存储中分配一个包含N 此类对象的数组。我要做的是:

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

也就是说,我将placement new与_aligned_malloc结合使用。

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

附言 我知道_aligned_malloc 不是标准的,而是特定于 MVSC 的。

【问题讨论】:

  • 显式调用析构函数不是更合适吗?我的意思是buf-&gt;~obj() 之类的东西,然后可以释放内存?
  • @W.F.我有个提示,我必须按照你的建议做一些事情,然后打电话给_aligned_free
  • 附带说明:static_cast&lt;obj*&gt; 在这里真的有必要吗? AFAIK 新位置将void* 作为参数。
  • 你不需要 static_cast
  • @tehcnically 数组放置 new 不可用,因为它可能需要您在 malloc 中不允许的未指定的簿记开销。 “正确”的方法是循环 N 次,每次调用非数组放置 new

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


【解决方案1】:

您的任务使用 C++11 alignas 还不够吗?

关于delete[] 的问题 - aligned_malloced 内存应该使用_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;
}

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

【讨论】:

  • 够愚蠢的,我想将我的功能包含在 C++11 之前。您看到经理的意见计为 20 票。
  • @101010 用我认为正确的方法进行第二次编辑
  • @101010 - 以我的经验,经理的决定在 很多 多于 20 票。更改编译器版本是一个不小的业务风险,如果您必须支持旧版本的 AIX/HPUX(吐!)您可能别无选择。
猜你喜欢
  • 2011-03-12
  • 2013-10-16
  • 1970-01-01
  • 2011-05-15
  • 2017-03-04
  • 1970-01-01
  • 2018-03-10
  • 2014-04-24
  • 2015-04-11
相关资源
最近更新 更多