Qt 和 Pimpl:双重释放或损坏出

问题描述

我想用 pimpl idiom 写一个 qt c++ lib。

基于这篇文章How to use the Qt's PIMPL idiom?,我编写了一个小程序

编译和运行没问题,但如果我想用 deleteLater() 关闭客户端,Prog 会引发错误

Client: destroy instance!
ClientPrivate: destroy instance!
double free or corruption (out)

Child terminated with signal = 0x6 (SIGABRT)

我(必须)使用 qt5.6。 gcc9、debian buster(以及后来的 windows)。我是 qt 的 C++ 框架世界的新手,不幸的是我不知道 100% Qt 的内部机制......我的问题在哪里?

谢谢!

// public header

namespace X
{
    namespace Y
    {
        class GCDE_DLL_EXPORT Client; // marco generated by CMake
        class ClientPrivate;
        class Client: public QObject
        {
            Q_OBJECT
            Q_DECLARE_PRIVATE(Client)
            QScopedPointer<ClientPrivate> d_ptr;

        public:
            Client(QObject* parent = Q_NULLPTR);
            ~Client();
        };
    }
}
// private header
namespace X
{
    namespace Y
    {
        class ClientPrivate
        {
            // disable copy ctr's
            Q_disABLE_copY(ClientPrivate)

            // Ptr to interface
            Q_DECLARE_PUBLIC(Client)
            Client* q_ptr;

        public:
            ClientPrivate(Client* interf);
            ~ClientPrivate();
        };
    }
}
// impl cpp
namespace X
{
    namespace Y
    {
        ClientPrivate::ClientPrivate(Client* interf):
                q_ptr(interf)
        {}


        ClientPrivate::~ClientPrivate()
        {
            qDebug() << "ClientPrivate: destroy instance!";
        }


        Client::Client(QObject* parent): QObject(parent)
                d_ptr(new ClientPrivate(this))
        {}

        Client::~Client()
        {
            qDebug() << "Client: destroy instance!";
        }
    }
}
// tester
#include <QtCore/QObject>
#include <QtCore/QTimer>
#include <QtCore/QCoreApplication>

#include <socket.hpp>

int main(int argc,char *argv[])
{
    using namespace X;
    QCoreApplication qapp(argc,argv);

    Y::Client clt;

    QTimer::singleShot(2000,&clt,SLOT(deleteLater())); // after 2s -> raise double free

    return qapp.exec();
}

解决方法

啊,我傻xD!谢谢!测试仪是问题所在。 clt 不是动态分配...我只关注类...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...