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>
This commit is contained in:
Marc Mutz 2012-02-19 20:53:20 +01:00 committed by Qt by Nokia
parent 60f7473782
commit ae445b20fa

View File

@ -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();
}
/*!