我在我的应用中使用Singleton模式的小部件。 所以我已经为此做了实施。
testwidget.h
class TestWidget;
class TstWidgetHolder
{
static TestWidget* wobj;
public:
static const TestWidget* instance();
static void setParent(QWidget*);
};
class TestWidget : public QWidget
{
Q_OBJECT
friend class TstWidgetHolder;
private:
Ui::TestWidget ui;
explicit TestWidget(QWidget *parent = 0);
~TestWidget();
};
testwidget.cpp
TestWidget::TestWidget(QWidget *parent) :
QWidget(parent)
{
ui.setupUi(this);
}
TestWidget::~TestWidget()
{}
TestWidget* TstWidgetHolder::wobj = NULL;
void TstWidgetHolder::setParent(QWidget* obj)
{
static TestWidget tst(obj);
TstWidgetHolder::wobj = &tst;
}
const TestWidget* TstWidgetHolder::instance()
{
return wobj;
}
这很简单。 然后是主要程序我正在为这个单身人士设置父母。
TstWidgetHolder::setParent(this);
真正的问题来了。 当主窗口小部件关闭时,应用程序崩溃。
根据调试器,singleton小部件的析构函数被调用两次。 这当然是导致崩溃的原因。
问题是什么? 它是Qt或我的逻辑中的错误吗?
答案 0 :(得分:0)
当您TstWidgetHolder::setParent(this)
时,您正在委派{{1> 所有权 (换句话说,责任破坏){{1}实例到TestWidget
。因此,在this
指向的对象被破坏之前,它会尝试this
,这是静态对象...而 是什么让你的应用程序崩溃。要么您不使用delete tst
,要么应将setParent
更改为:
TstWidgetHolder::setParent