PR libstdc++/70966 fix lifetime bug for default resource
authorJonathan Wakely <jwakely@redhat.com>
Tue, 24 Jul 2018 13:03:11 +0000 (14:03 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 24 Jul 2018 13:03:11 +0000 (14:03 +0100)
PR libstdc++/70966
* include/experimental/memory_resource (__get_default_resource): Use
placement new to create an object with dynamic storage duration.

From-SVN: r262943

libstdc++-v3/ChangeLog
libstdc++-v3/include/experimental/memory_resource

index ba78ab8e914cc314a2027b31affe42a23c5b0ac1..1f87a12e2926a3529c7f60d0cd49a9d4d362319d 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-24  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/70966
+       * include/experimental/memory_resource (__get_default_resource): Use
+       placement new to create an object with dynamic storage duration.
+
 2018-07-23  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/70940
index 61273fc2c855e3e38170aa2c6cba9ae7b186ad9a..83379d1367a699c83610f6657e18dba20c0d96cb 100644 (file)
@@ -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(); }