我可以使用分配器对象释放由另一个分配器分配的内存吗?

问题描述 投票:5回答:2

据我所知,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?
  • 我不确定的是,是否使用另一个分配器a2a3对象(其中一个)来释放(释放)由a分配的内存是未定义的行为?

  • 如果可以,为什么像std::vector这样的类具有分配器对象,而不仅创建一个临时对象来分配/取消分配内存?

请澄清以上问题。

c++ allocator
2个回答
7
投票

我对标准的阅读说这是未定义的行为,除非分配器比较相等。 Table 34: Cpp17Allocator requirements [tab:cpp17.allocator]个状态,用于


6
投票

您可以在这里阅读有关分配器的规范:https://en.cppreference.com/w/cpp/named_req/Allocator。它们在不同的标准版本中做了一些更改,但是我将写有关C ++ 17和20演绎的文章。

© www.soinside.com 2019 - 2024. All rights reserved.