diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2018-07-24 14:03:11 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2018-07-24 14:03:11 +0100 |
commit | 0568ade6f8456715ee7ed8902f8e308b0ab3dbb5 (patch) | |
tree | 5adafb6d766e178537c917eef0b05e531587a813 | |
parent | ffb164c7df6931b92cf2ad2ef4bd102cec8e6be3 (diff) | |
download | gcc-0568ade6f8456715ee7ed8902f8e308b0ab3dbb5.zip gcc-0568ade6f8456715ee7ed8902f8e308b0ab3dbb5.tar.gz gcc-0568ade6f8456715ee7ed8902f8e308b0ab3dbb5.tar.bz2 |
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.
From-SVN: r262943
-rw-r--r-- | libstdc++-v3/ChangeLog | 6 | ||||
-rw-r--r-- | libstdc++-v3/include/experimental/memory_resource | 16 |
2 files changed, 16 insertions, 6 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ba78ab8..1f87a12 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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 diff --git a/libstdc++-v3/include/experimental/memory_resource b/libstdc++-v3/include/experimental/memory_resource index 61273fc..83379d1 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(); } |