【发布时间】:2020-03-28 22:56:01
【问题描述】:
假设我有一个固定的内存缓冲区
char *buffer;
我使用placement new在该缓冲区中分配我的结构
struct S
{
std::tuple<int, double, char> m_data;
auto getRecord()
{
return m_data;
}
};
S *newS = new(buffer + offset)S;
我知道我应该手动调用此类已分配项目的析构函数,但如果不涉及簿记/资源管理可以省略这个吗?换句话说,如果使用缓冲区的类的析构函数没有做任何事情(类似于上面的~S())可以跳过这一步吗?如果是这种情况,我可以重复使用缓冲区而不破坏以前的租户吗?
【问题讨论】:
-
如果你不需要做任何资源管理,为什么它首先要有析构函数?
-
@Barmar 编译器会自动生成一个
-
注意
buffer + offset地址对齐。 -
@alain 请详细说明。你的意思是如果我使用缓冲区有两种不同的类型,我必须确保某事?还是对单一类型也有警告?有什么有用的链接吗?
-
@Lorah:您必须确保指针
buffer + offset与您的类型正确对齐。如果buffer本身没有很好地对齐,或者如果您混合类型导致offset中断对齐,这可能是一个问题。
标签: c++