gpt4 book ai didi

c++ - 创建一个动态数组,同时延迟对象构造

转载 作者:太空宇宙 更新时间:2023-11-04 15:49:45 25 4
gpt4 key购买 nike

我希望能够“以某种方式”创建一个动态数组,它仍然允许我使用 new 运算符构建它的元素。这是我想要实现的目标:

A* a = new A[3]; //or any equivalent syntax 
new (&a[0]) A(myparams1); //placement new on first slot
new (&a[1]) A(myparams2, ...); //placement new on 2nd slot
new (&a[2]) A(myparams3, ...); //placement new on 3rd slot
delete[] a; //correct deletion of all elements

我知道这段代码可以工作(减去被覆盖的 3 个元素),但我想避免在第一次调用 new[] 时创建 3 个默认的 a 元素。我在这里假设我将总是在调用 delete[] 之前放置 3 个元素。我在想这样的事情可以通过使用对 A::operator new[] 的智能调用来实现,但我不确定如何实现。有人有什么主意吗?主要是出于好奇

最佳答案

你只是获取原始内存:

void* mem = ::operator new(capacity * sizeof(A));

任何类型都需要对齐,包括 A 的数组的。现在您可以在其中构建:

for (std::size_t i = 0; i < capacity; ++i)
{
void* addr = static_cast<char*>(mem) + i * sizeof(A);
new (addr) A(x, y, z, ...);
}

销毁需要您显式调用它:

for (std::size_t i = 0; i < capacity; ++i)
{
void* addr = static_cast<char*>(mem) + i * sizeof(A);
static_cast<A*>(addr)->~A();
}

现在你可以释放原始内存了:

::operator delete(mem);

请注意,这些都不是异常安全的。这也是std::vector<A>确实如此,请查看代码。

关于c++ - 创建一个动态数组,同时延迟对象构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10559182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com