是否可以使用单个内存块来存储多个对象?

时间:2018-02-25 15:38:43

标签: c++ strict-aliasing

我正在实现一个非常奇怪的结构,我在其中分配一个内存块并在其中存储多个不同类型的对象:

auto memory = reinterpret_cast<std::uintptr_t>(::operator new(size));
new(reinterpret_cast<void*>(memory)) Class1();
new(reinterpret_cast<void*>(memory + offset)) Class2();

我担心,此代码是否违反了严格的别名规则?

如果我按如下方式重写此代码怎么办?

void* memory = ::operator new(size);
new(memory) Class1();
new(reinterpret_cast<void*>(reinterpret_cast<char*>(memory) + offset)) Class2();

鉴于size保证足够大,memory + offset保证正确对齐,两个类构造函数都声明为nothrow,两个类的析构函数在内存释放时调用,此代码是否引入UB?我可以用这些代码遇到哪些其他问题?

0 个答案:

没有答案