【发布时间】:2021-06-03 23:12:51
【问题描述】:
我是placement new 的新手,所以我想将分配与初始化分开,使用它沿operator new 分配和构造我的用户定义类型class Foo 的数组。
这是我尝试过的:
struct Foo{
Foo(int x) : x_(x){
std::cout << "Foo(int)\n";
}
~Foo(){
std::cout << "~Foo()\n";
}
int x_ = 0;
};
int main(){
Foo* pf = static_cast<Foo*>(operator new[](10 * sizeof(Foo) ) );
for(int i = 0; i != 10; ++i)
new(pf + i)Foo(i * 7);
for(int i = 0; i != 10; ++i)
std::cout << pf[i].x_ << ", ";
std::cout << '\n';
for(int i = 0; i != 10; ++i)
pf[i].~Foo();
operator delete[](pf);
}
- 代码看起来运行良好,所以如果我遗漏了什么,请指导我。这是否类似于
class allocator的工作方式? (将分配与初始化分开)。
【问题讨论】:
-
这对我来说看起来很好,但是如果 Foo 过度对齐,这将不尊重 Foo 的对齐要求。如果 Foo 是模板类型,我会将其更改为
Foo* pf = static_cast<Foo*>(operator new[](10 * sizeof(Foo), std::align_val_t{alignof(Foo)} ) );。 -
我会完全摆脱
operator new[]和operator delete[],并使用std::aligned_storage作为数组,例如:using elemType = std::aligned_storage_t<sizeof(Foo), alignof(Foo)>; elemType data* = new elemType[10]; Foo* pf = reinterpret_cast<Foo*>(data); ... for(int i = 0; i < 10; ++i) { new (pf+i) Foo(...); } ... for(int i = 0; i < 10; ++i) pf[i].~Foo(); ... delete[] data; -
你可以使用
std::vector,就像你可以使用emplace数据一样。更简单,更易于维护。 -
@RemyLebeau
elemType *data = ...(错字)
标签: c++ new-operator placement-new