Qt singleton两次析构函数调用

时间:2014-04-05 18:52:39

标签: c++ qt inheritance singleton destructor

我在我的应用中使用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或我的逻辑中的错误吗?

HERE SOURCE CODE

1 个答案:

答案 0 :(得分:0)

当您TstWidgetHolder::setParent(this)时,您正在委派{{1> 所有权 (换句话说,责任破坏){{1}实例到TestWidget。因此,在this指向的对象被破坏之前,它会尝试this,这是静态对象...而 是什么让你的应用程序崩溃。要么您不使用delete tst,要么应将setParent更改为:

TstWidgetHolder::setParent