summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2012-02-19 20:53:20 +0100
committerQt by Nokia <qt-info@nokia.com>2012-02-21 15:28:40 +0100
commitae445b20fa2567f7e14d989f288edb69b0904433 (patch)
treeb26307f8c862b75e08edfc2859fbf9539b4af13b /src/corelib/tools
parent60f7473782b0a4deae11147631d846d7bc8e8bb2 (diff)
QEasingCurve: simplify and fix copy constructor
The copy constructor used the default Private constructor, followed by the application of the compiler-generated copy assignment operator, and finally replaced the config member with a copy of itself. This is needlessly inefficient. Worse: it's incorrect: if config->copy() throws, then *d_ptr is leaked. Solution: implement the copy constructor for Private, and use it in the copy constructor of the public class. Effect: everything that can throw now prevents the new Private class from being created, and the compiler ends up cleaning up after us. Change-Id: I09ed18bb39ee7cd81aaa8ba01676fc202502a8e3 Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Diffstat (limited to 'src/corelib/tools')
-rw-r--r--src/corelib/tools/qeasingcurve.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp
index 6f8572cfbf..7a47262798 100644
--- a/src/corelib/tools/qeasingcurve.cpp
+++ b/src/corelib/tools/qeasingcurve.cpp
@@ -419,6 +419,11 @@ public:
config(0),
func(&easeNone)
{ }
+ QEasingCurvePrivate(const QEasingCurvePrivate &other)
+ : type(other.type),
+ config(other.config ? other.config->copy() : 0),
+ func(other.func)
+ { }
~QEasingCurvePrivate() { delete config; }
void setType_helper(QEasingCurve::Type);
@@ -1080,12 +1085,9 @@ QEasingCurve::QEasingCurve(Type type)
Construct a copy of \a other.
*/
QEasingCurve::QEasingCurve(const QEasingCurve &other)
- : d_ptr(new QEasingCurvePrivate)
+ : d_ptr(new QEasingCurvePrivate(*other.d_ptr))
{
// ### non-atomic, requires malloc on shallow copy
- *d_ptr = *other.d_ptr;
- if (other.d_ptr->config)
- d_ptr->config = other.d_ptr->config->copy();
}
/*!