Browse Source

Migrate to unique_ptr for pimpl

- Make all d-pointers unique_ptr
- Fix memory leaks
Alexey Edelev 5 years ago
parent
commit
5c3d1644a4

+ 2 - 4
src/grpc/qabstractgrpcclient.cpp

@@ -40,14 +40,12 @@ public:
 using namespace QtProtobuf;
 
 QAbstractGrpcClient::QAbstractGrpcClient(const QString &service, QObject *parent) : QObject(parent)
-  , d(new QAbstractGrpcClientPrivate(service))
+  , d(std::make_unique<QAbstractGrpcClientPrivate>(service))
 {
 }
 
 QAbstractGrpcClient::~QAbstractGrpcClient()
-{
-    delete d;
-}
+{}
 
 void QAbstractGrpcClient::attachChannel(const std::shared_ptr<QAbstractGrpcChannel> &channel)
 {

+ 2 - 2
src/grpc/qabstractgrpcclient.h

@@ -41,7 +41,7 @@
 
 namespace QtProtobuf {
 class QAbstractGrpcChannel;
-
+class QAbstractGrpcClientPrivate;
 /*!
  * \ingroup QtGrpc
  * \brief The QAbstractGrpcClient class is bridge between gRPC clients and channels. QAbstractGrpcClient provides set of
@@ -204,6 +204,6 @@ private:
     QAbstractGrpcClient &operator =(QAbstractGrpcClient &&) = delete;
 
     // PIMPL
-    class QAbstractGrpcClientPrivate *d;
+    std::unique_ptr<QAbstractGrpcClientPrivate> d;
 };
 }

+ 1 - 2
src/grpc/qgrpchttp2channel.cpp

@@ -187,13 +187,12 @@ struct QGrpcHttp2ChannelPrivate {
 }
 
 QGrpcHttp2Channel::QGrpcHttp2Channel(const QUrl &url, const AbstractCredentials &credentials) : QAbstractGrpcChannel()
-  , d(new QGrpcHttp2ChannelPrivate(url, credentials))
+  , d(std::make_unique<QGrpcHttp2ChannelPrivate>(url, credentials))
 {
 }
 
 QGrpcHttp2Channel::~QGrpcHttp2Channel()
 {
-    delete d;
 }
 
 QGrpcStatus QGrpcHttp2Channel::call(const QString &method, const QString &service, const QByteArray &args, QByteArray &ret)

+ 5 - 2
src/grpc/qgrpchttp2channel.h

@@ -28,11 +28,12 @@
 #include "qabstractgrpcchannel.h"
 
 #include <QUrl>
+#include <memory>
 
 namespace QtProtobuf {
 
 class AbstractCredentials;
-
+struct QGrpcHttp2ChannelPrivate;
 /*!
  * \ingroup QtGrpc
  * \brief The QGrpcHttp2Channel class
@@ -52,8 +53,10 @@ protected:
 
 private:
     Q_DISABLE_COPY(QGrpcHttp2Channel)
+    QGrpcHttp2Channel(QGrpcHttp2Channel &&) = delete;
+    QGrpcHttp2Channel &operator =(QGrpcHttp2Channel &&) = delete;
 
     // PIMPL
-    struct QGrpcHttp2ChannelPrivate *d;
+    std::unique_ptr<QGrpcHttp2ChannelPrivate> d;
 };
 }

+ 9 - 10
src/grpc/qgrpcstatus.cpp

@@ -29,23 +29,25 @@ namespace QtProtobuf {
 
 class QGrpcStatusPrivate {
 public:
-    QGrpcStatusPrivate(QGrpcStatus::StatusCode code, QString message) : m_code(code)
+    QGrpcStatusPrivate(QGrpcStatus::StatusCode code, const QString &message) : m_code(code)
       , m_message(message)
     {}
 
+    ~QGrpcStatusPrivate() = default;
+
     QGrpcStatus::StatusCode m_code;
     QString m_message;
 };
 
-QGrpcStatus::QGrpcStatus(StatusCode code, QString message) : d(new QGrpcStatusPrivate(code, message))
+QGrpcStatus::QGrpcStatus(StatusCode code, const QString &message) :
+    d(std::make_unique<QGrpcStatusPrivate>(code, message))
 {}
 
-QGrpcStatus::QGrpcStatus(const QGrpcStatus &other) : d(new QGrpcStatusPrivate(other.d->m_code, other.d->m_message))
+QGrpcStatus::QGrpcStatus(const QGrpcStatus &other) : d(std::make_unique<QGrpcStatusPrivate>(other.d->m_code, other.d->m_message))
 {}
 
-QGrpcStatus::QGrpcStatus(QGrpcStatus &&other) : d(other.d)
+QGrpcStatus::QGrpcStatus(QGrpcStatus &&other) : d(std::move(other.d))
 {
-    other.d = nullptr;
 }
 
 QGrpcStatus &QGrpcStatus::operator =(const QGrpcStatus &other)
@@ -57,15 +59,12 @@ QGrpcStatus &QGrpcStatus::operator =(const QGrpcStatus &other)
 
 QGrpcStatus &QGrpcStatus::operator =(QGrpcStatus &&other)
 {
-    d = other.d;
-    other.d = nullptr;
+    d = std::move(other.d);
     return *this;
 }
 
 QGrpcStatus::~QGrpcStatus()
-{
-    delete d;
-}
+{}
 
 QString QGrpcStatus::message() const
 {

+ 5 - 2
src/grpc/qgrpcstatus.h

@@ -28,9 +28,12 @@
 #include <QString>
 
 #include "qtgrpcglobal.h"
+#include <memory>
 
 namespace QtProtobuf {
 
+class QGrpcStatusPrivate;
+
 /*!
  * \ingroup QtGrpc
  * \brief The QGrpcStatus class contains information about last gRPC operation. In case of error in call/subscription
@@ -65,7 +68,7 @@ public:
         DataLoss = 15,          //!< Unrecoverable data loss or corruption
     };
 
-    QGrpcStatus(StatusCode code = StatusCode::Ok, QString message = QString());
+    QGrpcStatus(StatusCode code = StatusCode::Ok, const QString &message = QString());
     ~QGrpcStatus();
 
     /*!
@@ -89,7 +92,7 @@ public:
     QGrpcStatus &operator =(QGrpcStatus &&other);
 
 private:
-    class QGrpcStatusPrivate *d;
+    std::unique_ptr<QGrpcStatusPrivate> d;
 };
 }
 

+ 1 - 0
tests/test_grpc/clienttest.cpp

@@ -233,6 +233,7 @@ TEST_F(ClientTest, StringEchoStreamTestRetUpdates)
 
     ASSERT_EQ(i, 4);
     ASSERT_STREQ(result->testFieldString().toStdString().c_str(), "Stream4");
+    delete result;
 }