问题描述
我想用 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
不是动态分配...我只关注类...