释放unsynchronized_pool_resource后再次调用allocate()是否为未定义行为?
关于std::pmr::unsynchronized_pool_resource释放后调用allocate的行为疑问
我正在学习std::pmr::unsynchronized_pool_resource的行为,编写了如下示例代码:
std::pmr::monotonic_buffer_resource buffer_resource{std::pmr::new_delete_resource()}; //monotonic wrapper raw memory get from new_delete_resource std::pmr::unsynchronized_pool_resource midlevel{&buffer_resource}; //2nd pool std::pmr::unsynchronized_pool_resource un_sync{&midlevel}; //3rd pool std::pmr::polymorphic_allocator<MyClass> allocator{&un_sync}; //allocator get memory from 3rd pool MyClass* t = allocator.allocate(1); allocator.construct(t, 20); allocator.destroy(t); un_sync.release(); //release MyClass* ttt = allocator.allocate(1); //call allocate on released memory resources allocator.construct(ttt, 40); allocator.destroy(ttt);
测试发现代码可正常运行,且第3个池似乎从第2个池重建了资源,但未找到明确的相关说明,特此询问:释放unsynchronized_pool_resource后再次调用allocate()是否属于未定义行为?
解答:
调用unsynchronized_pool_resource::release()后再调用allocate()不属于未定义行为,这是符合C++标准规定的合法操作。
根据C++标准对unsynchronized_pool_resource的定义:
release()的作用是将该池当前持有的所有未分配内存块归还给上游的内存资源,但并不会销毁该池对象本身,池对象仍然处于有效状态。- 当后续再次调用
allocate()时,该池会重新向上游资源申请新的内存块来满足分配需求,就像它刚被初始化时一样。
你示例中的un_sync池在调用release()后,只是把之前持有的内存还给了midlevel池;当后续allocator.allocate(1)触发un_sync的分配操作时,un_sync会重新向midlevel申请内存,因此代码能够正常运行,这完全符合预期行为。
内容的提问来源于stack exchange,提问作者Kevin eyeson
相关产品推荐
相关产品推荐

