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 <jwak...@redhat.com> 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(); }