fix move ctor/assignment

This commit is contained in:
Günter Obiltschnig 2020-01-21 19:58:12 +01:00
parent 18adb1e43b
commit eeb64cc340
4 changed files with 50 additions and 48 deletions

View File

@ -182,7 +182,7 @@ public:
AutoPtr& operator = (AutoPtr&& ptr) noexcept AutoPtr& operator = (AutoPtr&& ptr) noexcept
{ {
if (_ptr) _ptr->release(); if (_ptr) _ptr->release();
_ptr = std::move(ptr._ptr); _ptr = ptr._ptr;
ptr._ptr = nullptr; ptr._ptr = nullptr;
return *this; return *this;
} }

View File

@ -123,7 +123,7 @@ public:
Nullable& assign(C&& value) Nullable& assign(C&& value)
/// Assigns a value to the Nullable. /// Assigns a value to the Nullable.
{ {
_value = value; _value = std::move(value);
_isNull = false; _isNull = false;
return *this; return *this;
} }
@ -152,7 +152,7 @@ public:
Nullable& operator = (C&& value) Nullable& operator = (C&& value)
/// Move-assigns a value to the Nullable. /// Move-assigns a value to the Nullable.
{ {
return assign(value); return assign(std::move(value));
} }
Nullable& operator = (const Nullable& other) Nullable& operator = (const Nullable& other)

View File

@ -105,7 +105,7 @@ public:
Optional& assign(C&& value) Optional& assign(C&& value)
/// Moves a value into the Optional. /// Moves a value into the Optional.
{ {
_value = value; _value = std::move(value);
_isSpecified = true; _isSpecified = true;
return *this; return *this;
} }
@ -125,7 +125,7 @@ public:
Optional& operator = (C&& value) Optional& operator = (C&& value)
{ {
return assign(value); return assign(std::move(value));
} }
Optional& operator = (const Optional& other) Optional& operator = (const Optional& other)

View File

@ -61,7 +61,7 @@ class ReleasePolicy
/// simply uses the delete operator to delete an object. /// simply uses the delete operator to delete an object.
{ {
public: public:
static void release(C* pObj) static void release(C* pObj) noexcept
/// Delete the object. /// Delete the object.
/// Note that pObj can be nullptr. /// Note that pObj can be nullptr.
{ {
@ -75,7 +75,7 @@ class ReleaseArrayPolicy
/// The release policy for SharedPtr holding arrays. /// The release policy for SharedPtr holding arrays.
{ {
public: public:
static void release(C* pObj) static void release(C* pObj) noexcept
/// Delete the object. /// Delete the object.
/// Note that pObj can be nullptr. /// Note that pObj can be nullptr.
{ {
@ -115,7 +115,9 @@ class SharedPtr
public: public:
typedef C Type; typedef C Type;
SharedPtr(): _pCounter(nullptr), _ptr(nullptr) SharedPtr():
_pCounter(nullptr),
_ptr(nullptr)
{ {
} }
@ -131,33 +133,32 @@ public:
} }
template <class Other, class OtherRP> template <class Other, class OtherRP>
SharedPtr(const SharedPtr<Other, RC, OtherRP>& ptr): _pCounter(ptr._pCounter), _ptr(const_cast<Other*>(ptr.get())) SharedPtr(const SharedPtr<Other, RC, OtherRP>& ptr):
_pCounter(ptr._pCounter),
_ptr(const_cast<Other*>(ptr.get()))
{ {
if (_pCounter) _pCounter->duplicate(); if (_pCounter) _pCounter->duplicate();
} }
SharedPtr(const SharedPtr& ptr): _pCounter(ptr._pCounter), _ptr(ptr._ptr) SharedPtr(const SharedPtr& ptr):
_pCounter(ptr._pCounter),
_ptr(ptr._ptr)
{ {
if (_pCounter) _pCounter->duplicate(); if (_pCounter) _pCounter->duplicate();
} }
SharedPtr(SharedPtr&& ptr) noexcept: _pCounter(std::move(ptr._pCounter)), _ptr(std::move(ptr._ptr)) SharedPtr(SharedPtr&& ptr) noexcept:
_pCounter(ptr._pCounter),
_ptr(ptr._ptr)
{ {
ptr._pCounter = nullptr; ptr._pCounter = nullptr;
ptr._ptr = nullptr; ptr._ptr = nullptr;
} }
~SharedPtr() ~SharedPtr()
{
try
{ {
release(); release();
} }
catch (...)
{
poco_unexpected();
}
}
SharedPtr& assign(C* ptr) SharedPtr& assign(C* ptr)
{ {
@ -223,9 +224,10 @@ public:
SharedPtr& operator = (SharedPtr&& ptr) noexcept SharedPtr& operator = (SharedPtr&& ptr) noexcept
{ {
_ptr = std::move(ptr._ptr); release();
_pCounter = std::move(ptr._pCounter); _ptr = ptr._ptr;
ptr._ptr = nullptr; ptr._ptr = nullptr;
_pCounter = ptr._pCounter;
ptr._pCounter = nullptr; ptr._pCounter = nullptr;
return *this; return *this;
} }
@ -423,7 +425,7 @@ private:
return _ptr; return _ptr;
} }
void release() void release() noexcept
{ {
if (_pCounter && _pCounter->release() == 0) if (_pCounter && _pCounter->release() == 0)
{ {