Ras*_*lis 3 c++ malloc vector memory-alignment unique-ptr
在将对象添加到数据结构之前,我试图确保对象对齐vector。响应警告warning C4316: 'Basic' : object allocated on the heap may not be aligned 16,我对该对象有以下内容Basic:
class Basic
{
public:
Basic();
~Basic();
};
Run Code Online (Sandbox Code Playgroud)
这是这里的标准对象。接下来,unique_ptr将a 分配给new的实例,Basic以获得这样做的好处。(与标准指针相反)
unique_ptr<Basic> e_Basic{new Basic()};
Run Code Online (Sandbox Code Playgroud)
我尝试对齐数据,以便以后可以避免对齐问题:
e_Basic.reset =_aligned_malloc((size_t)sizeof(Basic), (size_t)(16 + (sizeof(Basic) % 16))); //Verify alignment.
Run Code Online (Sandbox Code Playgroud)
最后将指针添加到vector数组中。
LocalBasicQueue.push_back(move(e_Basic));
Run Code Online (Sandbox Code Playgroud)
编译器说它是犹太洁食,但我的“胡扯什么?” 代码意识正在消失。这会导致指向(肯定)对齐代码的指针吗?
以这种方式声明( e_Basic.reset) 等于指针[由 ] 返回并调用它,分配新指针是否可以?_aligned_malloc()unique_ptr<>
该代码存在一些问题。
Basic您无缘无故地分配、构造并立即销毁一个对象。Basic您永远不会在 分配的内存中初始化对象_aligned_malloc。unique_ptr会释放它管理的内存delete,但你没有new该内存,你_aligned_malloc编辑了它。这是一个坏主意,可能会导致堆损坏和/或崩溃。您可以通过不unique_ptr使用new Basic().
第二个可以使用放置新表达式来修复。
第三个问题可以通过提供unique_ptr一个调用~Basicand_aligned_free而不是delete Note 的自定义删除器来修复,尽管 aunique_ptr<Basic, my_deleter>是与 不同的类型unique_ptr<Basic>,因此您不能将其放入 a 中vector<unique_ptr<Basic>>。
Basic::operator new第二和第三个问题也可以通过重载和分别Basic::operator delete使用_aligned_malloc和来解决_aligned_delete,但这意味着new Basic()总是使用_aligned_malloc,您可能想要也可能不想要。