在将对象添加到vector
数据结构之前,我正在尝试确保对象已对齐。响应warning C4316: 'Basic' : object allocated on the heap may not be aligned 16
警告,我对Basic
对象有以下内容:
class Basic
{
public:
Basic();
~Basic();
};
这是一个标准对象。接下来,unique_ptr
到new
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<>
,并指定新指针?
答案 0 :(得分:2)
该代码存在一些问题。
Basic
对象。Basic
分配的内存中初始化_aligned_malloc
对象。unique_ptr
会释放它使用delete
管理的内存,但您没有new
该内存,您_aligned_malloc
编辑了它。这是一个坏主意,可能会导致堆损坏和/或崩溃。您可以通过不使用unique_ptr
初始化new Basic()
来解决第一个问题。
可以使用展示位置新表达式修复第二个。
第三个问题可以通过为unique_ptr
提供一个自定义删除工具来解决,该自定义删除工具会调用~Basic
和_aligned_free
而不是delete
注意unique_ptr<Basic, my_deleter>
是一个与unique_ptr<Basic>
不同的类型,因此您无法将其添加到vector<unique_ptr<Basic>>
。
第二个和第三个问题也可以通过重载Basic::operator new
和Basic::operator delete
分别使用_aligned_malloc
和_aligned_delete
来解决,但这意味着new Basic()
始终使用您可能想要或不想要的_aligned_malloc
。