QSharedDataPointer: use swap-and-move in the move constructor

This makes the pointer that was in the moved-into object be destroyed
before the return of this function (if the reference count was 1),
instead of letting it live in the moved-from object.

Task-number: QTBUG-66322
Change-Id: I3debfc11127e4516b505fffd151209292bd3adaa
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
bb10
Thiago Macieira 2018-02-10 10:08:16 -08:00 committed by Aapo Keskimolo
parent dabc76de80
commit 323b00e38c
1 changed files with 10 additions and 2 deletions

View File

@ -115,7 +115,11 @@ public:
#ifdef Q_COMPILER_RVALUE_REFS
QSharedDataPointer(QSharedDataPointer &&o) Q_DECL_NOTHROW : d(o.d) { o.d = nullptr; }
inline QSharedDataPointer<T> &operator=(QSharedDataPointer<T> &&other) Q_DECL_NOTHROW
{ qSwap(d, other.d); return *this; }
{
QSharedDataPointer moved(std::move(other));
swap(moved);
return *this;
}
#endif
inline bool operator!() const { return !d; }
@ -204,7 +208,11 @@ public:
#ifdef Q_COMPILER_RVALUE_REFS
inline QExplicitlySharedDataPointer(QExplicitlySharedDataPointer &&o) Q_DECL_NOTHROW : d(o.d) { o.d = nullptr; }
inline QExplicitlySharedDataPointer<T> &operator=(QExplicitlySharedDataPointer<T> &&other) Q_DECL_NOTHROW
{ qSwap(d, other.d); return *this; }
{
QExplicitlySharedDataPointer moved(std::move(other));
swap(moved);
return *this;
}
#endif
inline bool operator!() const { return !d; }