![](/img/trans.png)
[英]Can I use an allocator object to free memory allocated by another allocator?
[英]Should I call `delete` on object allocated using polymorphic allocator
Does polymorphic allocator (I personally use boost and C++17, but guess that it's the same for stl and C++20) in it's destructor automatically destructs objects allocated inside it's memory resource, or should delete
for each object be called manually, like if I '我使用默认的 stl std::allocator
(不调用delete
然后破坏 object 是未定义的行为)?
多态分配器是可廉价复制的 object 并且不拥有对象。
您可能会混淆它的是memory_resource
,它具有存储对象的能力。 尽管如此,它并不拥有这些,因为它甚至不知道存储在其容量中的对象的类型。
另一方面,有些容器类型使用分配器为其对象分配存储空间。 容器确实拥有这些对象,并将销毁它们并从相同的(或者更确切地说,等效的)分配器中释放它们。
简而言之,您不会从分配器进行分配,您的分配器感知容器会。 它不会调用 delete,而是调用预期的allocator.deallocate()
或allocator.delete_object()
,具体取决于分配的方式。
因为一个例子讲了一千个单词:
#include <iostream>
#include <memory_resource>
#include <vector>
struct X {
X() { std::cout << __PRETTY_FUNCTION__ << "\n"; }
~X() { std::cout << __PRETTY_FUNCTION__ << "\n"; }
};
int main() {
std::pmr::vector<X> v;
v.reserve(3); // watch v reallocate if you remove this line
v.emplace_back();
v.emplace_back();
v.emplace_back();
} // v destructs and deallocates automically
印刷:
X::X()
X::X()
X::X()
X::~X()
X::~X()
X::~X()
如果您删除对reserve()
的调用,我将把它作为练习来查看您的标准库实现是否会改变行为。
很明显,分配器接口不能直接使用:
#include <iostream>
#include <memory_resource>
#include <vector>
struct X {
X() { std::cout << __PRETTY_FUNCTION__ << "\n"; }
~X() { std::cout << __PRETTY_FUNCTION__ << "\n"; }
};
int main() {
std::pmr::monotonic_buffer_resource mem(1024);
std::pmr::polymorphic_allocator<X> alloc(&mem);
{
auto x1 = alloc.new_object<X>();
auto x2 = alloc.new_object<X>();
auto x3 = alloc.new_object<X>();
// cannot use `operator delete`:
// delete x1; // Undefined Behaviour
// need to manually delete the objects we own through the allocator
alloc.delete_object(x3);
alloc.delete_object(x2);
alloc.delete_object(x1);
}
{ // c++17 interface
auto x1 = alloc.allocate(sizeof(X)); alloc.construct(x1);
auto x2 = alloc.allocate(sizeof(X)); alloc.construct(x2);
auto x3 = alloc.allocate(sizeof(X)); alloc.construct(x3);
// cannot use `operator delete`:
// delete x1; // Undefined Behaviour
// need to manually delete the objects we own through the allocator
alloc.destroy(x3); alloc.deallocate(x3, sizeof(X));
alloc.destroy(x2); alloc.deallocate(x2, sizeof(X));
alloc.destroy(x1); alloc.deallocate(x1, sizeof(X));
}
}
印刷
X::X()
X::X()
X::X()
X::~X()
X::~X()
X::~X()
X::X()
X::X()
X::X()
X::~X()
X::~X()
X::~X()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.