@@ -290,6 +290,14 @@ class basic_observable_ptr {
290290 delete_object_ (block, ptr_deleter.data , ptr_deleter);
291291 }
292292
293+ void delete_object_if_exists_ () noexcept {
294+ if (ptr_deleter.data ) {
295+ delete_object_ ();
296+ block = nullptr ;
297+ ptr_deleter.data = nullptr ;
298+ }
299+ }
300+
293301 // / Decide whether to allocate a new control block or not.
294302 /* * \note If the object inherits from @ref basic_enable_observer_from_this, and
295303 * `Policy::is_sealed` is false (by construction this will always be the case when this
@@ -350,11 +358,7 @@ class basic_observable_ptr {
350358
351359 // / Destructor, releases owned object if any
352360 ~basic_observable_ptr () noexcept {
353- if (ptr_deleter.data ) {
354- delete_object_ ();
355- block = nullptr ;
356- ptr_deleter.data = nullptr ;
357- }
361+ delete_object_if_exists_ ();
358362 }
359363
360364 // / Transfer ownership by implicit casting
@@ -396,8 +400,8 @@ class basic_observable_ptr {
396400 basic_observable_ptr (basic_observable_ptr<U,D,Policy>&& manager, V* value) noexcept :
397401 basic_observable_ptr (value != nullptr ? manager.block : nullptr , value) {
398402
399- if (manager. ptr_deleter . data != nullptr && value == nullptr ) {
400- manager.delete_object_ ();
403+ if (value == nullptr ) {
404+ manager.delete_object_if_exists_ ();
401405 }
402406
403407 manager.block = nullptr ;
@@ -416,8 +420,8 @@ class basic_observable_ptr {
416420 basic_observable_ptr (basic_observable_ptr<U,D,Policy>&& manager, V* value, Deleter del) noexcept :
417421 basic_observable_ptr (value != nullptr ? manager.block : nullptr , value, std::move(del)) {
418422
419- if (manager. ptr_deleter . data != nullptr && value == nullptr ) {
420- manager.delete_object_ ();
423+ if (value == nullptr ) {
424+ manager.delete_object_if_exists_ ();
421425 }
422426
423427 manager.block = nullptr ;
@@ -453,9 +457,7 @@ class basic_observable_ptr {
453457 * pointer is set to null and looses ownership.
454458 */
455459 basic_observable_ptr& operator =(basic_observable_ptr&& value) noexcept {
456- if (ptr_deleter.data ) {
457- delete_object_ ();
458- }
460+ delete_object_if_exists_ ();
459461
460462 block = value.block ;
461463 value.block = nullptr ;
@@ -476,9 +478,7 @@ class basic_observable_ptr {
476478 template <typename U, typename D, typename enable =
477479 std::enable_if_t <std::is_convertible_v<U*, T*> && std::is_convertible_v<D, Deleter>>>
478480 basic_observable_ptr& operator =(basic_observable_ptr<U,D,Policy>&& value) noexcept {
479- if (ptr_deleter.data ) {
480- delete_object_ ();
481- }
481+ delete_object_if_exists_ ();
482482
483483 block = value.block ;
484484 value.block = nullptr ;
0 commit comments