微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 具有旧式的内存管理,因此它不能很好地与开箱即用的新标准内容混合。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。