unique_ptr<>的C ++数据对齐使用_aligned_malloc()

时间:2016-02-28 23:55:45

标签: c++ vector malloc unique-ptr memory-alignment

在将对象添加到vector数据结构之前,我正在尝试确保对象已对齐。响应warning C4316: 'Basic' : object allocated on the heap may not be aligned 16警告,我对Basic对象有以下内容:

class Basic
{
public:
    Basic();
    ~Basic();
};

这是一个标准对象。接下来,unique_ptrnew Basic实例的分配是为了这样做的好处。 (而不是标准指针)

unique_ptr<Basic> e_Basic{new Basic()};

我尝试对齐数据,以便以后可以避免对齐问题:

e_Basic.reset =_aligned_malloc((size_t)sizeof(Basic), (size_t)(16 + (sizeof(Basic) % 16))); //Verify alignment.

最后添加指向vector数组的指针。

LocalBasicQueue.push_back(move(e_Basic));

编译器说这是犹太人,但我的“什么是软糖?”代码意识正在消失。这是否会导致指向(肯定)对齐的代码?

是否可以以这种方式声明(e_Basic.reset)等于[_aligned_malloc()]返回的指针并调用其unique_ptr<>,并指定新指针?

1 个答案:

答案 0 :(得分:2)

该代码存在一些问题。

  1. 您无缘无故地分配,构造,然后立即销毁Basic对象。
  2. 您永远不会在Basic分配的内存中初始化_aligned_malloc对象。
  3. 默认情况下,unique_ptr会释放它使用delete管理的内存,但您没有new该内存,您_aligned_malloc编辑了它。这是一个坏主意,可能会导致堆损坏和/或崩溃。
  4. 您可以通过不使用unique_ptr初始化new Basic()来解决第一个问题。

    可以使用展示位置新表达式修复第二个。

    第三个问题可以通过为unique_ptr提供一个自定义删除工具来解决,该自定义删除工具会调用~Basic_aligned_free而不是delete注意unique_ptr<Basic, my_deleter>是一个与unique_ptr<Basic>不同的类型,因此您无法将其添加到vector<unique_ptr<Basic>>

    第二个和第三个问题也可以通过重载Basic::operator newBasic::operator delete分别使用_aligned_malloc_aligned_delete来解决,但这意味着new Basic()始终使用您可能想要或不想要的_aligned_malloc