据我所知,std::allocator
是由库引入的,用于分配未初始化的未构造的内存块。因此:
std::allocator<int> a;
auto ptr = a.allocate(100);
auto e = ptr;
while (e != ptr + 5)
a.construct(e++, 0);
for (auto tmp = ptr; tmp != e; )
std::cout << *tmp++ << ", ";
std::cout << std::endl;
std::allocator<int> a2;
std::allocator<int> a3 = a;
for (auto tmp = ptr; tmp != e; )
a.destroy(tmp++);
//for (auto tmp = ptr; tmp != e; )
// a2.destroy(tmp++); // is it UB using a2 here to destroy elements?
//for (auto tmp = ptr; tmp != e; )
// a3.destroy(tmp++); // is it UB also?
a.deallocate(ptr, 100); // ok
//a2.deallocate(ptr, 100); // UB or OK?
//a3.deallocate(ptr, 100); // UB or ok?
我不确定的是,是否使用另一个分配器a2
,a3
对象(其中一个)来释放(释放)由a
分配的内存是未定义的行为?
如果可以,为什么像std::vector
这样的类具有分配器对象,而不仅创建一个临时对象来分配/取消分配内存?
请澄清以上问题。
我对标准的阅读说这是未定义的行为,除非分配器比较相等。 Table 34: Cpp17Allocator requirements [tab:cpp17.allocator]个状态,用于
您可以在这里阅读有关分配器的规范:https://en.cppreference.com/w/cpp/named_req/Allocator。它们在不同的标准版本中做了一些更改,但是我将写有关C ++ 17和20演绎的文章。