Fix SharedPtr::reset

SharedPtr::reset did not actually set the stored pointer value.
Correct this, with other minor tidies:

* Ensure counter is set to NULL if pointer is reset to NULL
* Be consistent about not clearing pointers in decrement_counter().
pull/9580/head
Kevin Bracey 2019-01-31 16:35:53 +02:00
parent a4ed473afc
commit 0b27c9149e
1 changed files with 5 additions and 2 deletions

View File

@ -145,10 +145,13 @@ public:
// Clean up by decrementing counter // Clean up by decrementing counter
decrement_counter(); decrement_counter();
_ptr = ptr;
if (ptr != NULL) { if (ptr != NULL) {
// Allocate counter on the heap, so it can be shared // Allocate counter on the heap, so it can be shared
_counter = new uint32_t; _counter = new uint32_t;
*_counter = 1; *_counter = 1;
} else {
_counter = NULL;
} }
} }
@ -226,6 +229,8 @@ private:
/** /**
* @brief Decrement reference counter. * @brief Decrement reference counter.
* @details If count reaches zero, free counter and delete object pointed to. * @details If count reaches zero, free counter and delete object pointed to.
* Does not modify our own pointers - assumption is they will be overwritten
* or destroyed immediately afterwards.
*/ */
void decrement_counter() void decrement_counter()
{ {
@ -233,9 +238,7 @@ private:
uint32_t new_value = core_util_atomic_decr_u32(_counter, 1); uint32_t new_value = core_util_atomic_decr_u32(_counter, 1);
if (new_value == 0) { if (new_value == 0) {
delete _counter; delete _counter;
_counter = NULL;
delete _ptr; delete _ptr;
_ptr = NULL;
} }
} }
} }