Similar to what I did for the new_delete_resource and
null_memory_resource objects, this makes the atomic<memory_resource*>
immortal. This ensure it can still be used after static destructors
start running.
PR libstdc++/70966
* include/experimental/memory_resource (__get_default_resource): Use
placement new to create an object with dynamic storage duration.
Tested powerpc64le-linux, committed to trunk.
commit 5e51f3630b506d993737c95c65b251acaa433076
Author: Jonathan Wakely <[email protected]>
Date: Mon Jul 23 23:30:38 2018 +0100
PR libstdc++/70966 fix lifetime bug for default resource
PR libstdc++/70966
* include/experimental/memory_resource (__get_default_resource): Use
placement new to create an object with dynamic storage duration.
diff --git a/libstdc++-v3/include/experimental/memory_resource
b/libstdc++-v3/include/experimental/memory_resource
index 61273fc2c85..83379d1367a 100644
--- a/libstdc++-v3/include/experimental/memory_resource
+++ b/libstdc++-v3/include/experimental/memory_resource
@@ -459,12 +459,6 @@ namespace pmr {
};
// Global memory resources
- inline std::atomic<memory_resource*>&
- __get_default_resource()
- {
- static atomic<memory_resource*> _S_default_resource(new_delete_resource());
- return _S_default_resource;
- }
inline memory_resource*
new_delete_resource() noexcept
@@ -499,6 +493,16 @@ namespace pmr {
}
// The default memory resource
+
+ inline std::atomic<memory_resource*>&
+ __get_default_resource()
+ {
+ using type = atomic<memory_resource*>;
+ alignas(type) static unsigned char __buf[sizeof(type)];
+ static type* __r = new(__buf) type(new_delete_resource());
+ return *__r;
+ }
+
inline memory_resource*
get_default_resource() noexcept
{ return __get_default_resource().load(); }