我正在实现一个非常奇怪的结构,我在其中分配一个内存块并在其中存储多个不同类型的对象:
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?我可以用这些代码遇到哪些其他问题?