C++ _应用单例模式后,退出主窗口时引发CrtIsValidHeapPointer(块)错误

C++ _应用单例模式后,退出主窗口时引发CrtIsValidHeapPointer(块)错误,c++,qt,C++,Qt,我正在windows上开发一个Qt桌面应用程序。在主窗口中,我需要将一个小部件添加到我的选项卡小部件中,它通常如下所示: void MainWindow::setConfParas() { ConfParas *confparas=new ConfParas(); ui->TabWidget->addTab(confparas,"Configure Parameters"); } 我尝试将单例模式应用到我的类中,它的设计如下 clas

我正在windows上开发一个Qt桌面应用程序。在主窗口中,我需要将一个小部件添加到我的选项卡小部件中,它通常如下所示:

void MainWindow::setConfParas()
    {
        ConfParas *confparas=new ConfParas();
        ui->TabWidget->addTab(confparas,"Configure Parameters");
    }
我尝试将单例模式应用到我的类中,它的设计如下

class ConfParas : public QWidget
{
    Q_OBJECT

public:
    static ConfParas* getInstance()
    {
        static ConfParas theConfParas;
        return &theConfParas;
    }
    explicit ConfParas(QWidget *parent = 0);
    ConfParas(const ConfParas&)=delete;
    ConfParas& operator=(const ConfParas&)=delete;
    //sth else...
}
前一段代码的编写方式如下:

void MainWindow::setConfParas()
    {
        ConfParas *confparas=ConfParas::getInstance();
        ui->TabWidget->addTab(confparas,"Configure Parameters");
    }
而且编译器没有发出任何错误消息,我可以轻松启动应用程序,但当我关闭主窗口时,会引发\u CrtIsValidHeapPointerblock错误!!!
所以我猜它发生在主窗口解构期间。

当您将指针传递给QObject时,Qt将接管该指针的生命周期。它假定内存是动态分配的,然后在解除分配时调用delete。此规则的一个例外是,如果子项在其父项之前被销毁

静态成员在堆栈上声明,并由运行时管理。当您将其传递给QObject时,您请求双重删除。也就是说,调用将所有权委托给QTabWidget的。这个QTabWidget,一个非静态变量将在QWidget的任何静态变量之前被销毁。由于它是父对象,它还将在QWidget中删除其子对象,然后在main结束时,它还将调用静态QWidget的析构函数,因此是双重删除


如果将静态成员设置为在第一次调用时分配的指针,则不会出现此问题。事实上,我知道一些开发人员会说这不是一个真正的问题,他们不会说我同意他们的观点,因为在拆除建筑物之前清理建筑物有什么意义?

事实上,我已经试着按照你说的做了,制作一个静态私有成员指针,在第一次调用时分配它并返回一个指针,但是编译器总是给我LKN2001错误@陈裘凯: 如果你用一条准确的错误信息和相应的代码来更新你的问题,我也许能帮上忙。我已经解决了这个问题。。。我忘了在cpp文件中初始化指向nullptr的静态成员指针,我的大脑一定出了什么问题……无论如何,很多感谢