使用QNetworkAccessManager时遇到的一个古怪问题

阿克蒙德麟 2023-07-27 15:02:51

写了一个网络交互的类,在类里面有QNetworkAccessManager* mManager的指针成员,类构造时new出来(未指定父类)。
在类中的网络交互(HTTP交互)函数中采用QEventLoop卡住,交互完成后,停止QEventLoop,获取数据并返回。
外层调用此类,在线程中(moveToThread 或者 局部线程QtConcurrent ),采用局部变量的方式。

遇到一个奇怪的问题, 在这个网络交互的类里面,析构函数中,采用delete 或 deleteLater 删除mManager ,在整个程序结束时(使用过程中不会),都会造成崩溃。测试采用非指针的QNetworkAccessManager类成员时也会出现这个问题,将new出来的QNetworkAccessManager* mManager父亲指定为网络交互类,也会有此类问题

注:这个网络交互类编译成dll了,作为app依赖库,在windows下DEBUG。返回的QNetworkReply经测试释不释放都不影响这个问题的出现,后续发现返回的QNetworkReply属于QNetworkAccessManager的子对象,因此当前是没有主动去释放的。

有大佬能指点一下为什么吗?

...全文
1683 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿克蒙德麟 2023-08-01
  • 打赏
  • 举报
回复

采用虚拟机进行win7、win8、win10 x32 x64 , win11 x64测试,发现这个问题只在debug模式下才会出现,因此这个问题不再理会,在这里结贴

A11000100A 2023-07-28
  • 打赏
  • 举报
回复

根据你提供的信息,可能是因为在析构函数中使用delete或deleteLater删除mManager时,mManager已经被删除或者已经被释放,导致程序崩溃。

你可以尝试在析构函数中加入一些调试输出,查看mManager是否为空或者已经被释放。另外,你还可以尝试使用智能指针来管理mManager的生命周期,例如使用std::unique_ptr或者std::shared_ptr,避免手动管理指针的麻烦和潜在的内存泄漏问题。

另外,如果你的网络交互类是作为app依赖库编译的,建议你在程序结束时手动释放所有动态分配的内存,以避免内存泄漏问题。可以考虑在程序结束前调用QApplication::quit()或者QCoreApplication::exit()函数,等待程序退出前的所有事件循环结束,然后再手动释放所有动态分配的内存。

阿克蒙德麟 2023-07-31
  • 举报
回复
@A11000100A 你好,感谢您的回复,我这边的描述可能有些不清楚,是这样的,在析构函数中deleteLater,在整个程序的使用过程中,都不会出现程序崩溃,因为会多次调用这个类(虽然这里这种写法可能是不对的),所以会多次申请和析构,运行时,没有问题出现,但是在整个程序结束时,手动关闭应用程序,这个时候,就会出现崩溃的提示了。 第二点的话,有调用qApp->exit(),然后杀进程(杀自己的进程)

16,814

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧