unique_ptr 和错误:运行时检查失败 #2 - 围绕变量“w”的堆栈在 QT 中已损坏

问题描述

我正在用 QT 编写一个应用程序。我想使用QButtonGroup,所以我在用户界面类的头文件中声明它:

std::unique_ptr<QButtonGroup> examTypeSelectGroup;

但是当我关闭应用程序时,我收到错误

Run-Time Check Failure #2 - Stack around the variable 'w' was corrupted.

在main.cpp文件的最后一行,这是一个项目的mian文件。发生错误时的调用堆栈只有main()

>   OCT_main.exe!main(int argc,char * * argv) Line 14
    [External Code]

错误发生在我尝试使用对象和不使用它时(只需声明它)。 你知道发生了什么吗。

main.cpp:

1   #include "oct_main.h"
2
3   #include <QApplication>
4
5   int main(int argc,char *argv[])
6   {
7       QApplication a(argc,argv);
8
9       //run window
10      OCT_main w;
11      w.show();
12
13      return a.exec();
14  }

编辑:在销毁按钮组期间使用 QButtonGroup examTypeSelectGroup; 会出错,所以这也是不好的方式。

解决方法

Qt 的第一条规则(更准确地说,任何 QObject 派生类),永远不要对其调用 delete。

因此,像您使用的基本 unique_ptr 可能是个坏主意,您要么必须编写自定义删除器来调用 deleteLater(),要么使用 Qt 自己的智能指针

https://wiki.qt.io/Smart_Pointers

即便如此,我也不认为它们提供了与 QObject 派生类一起使用的智能指针。

Qt 具有旧式的内存管理,因此它不能很好地与开箱即用的新标准内容混合。