16,814
社区成员




写了一个网络交互的类,在类里面有QNetworkAccessManager* mManager的指针成员,类构造时new出来(未指定父类)。
在类中的网络交互(HTTP交互)函数中采用QEventLoop卡住,交互完成后,停止QEventLoop,获取数据并返回。
外层调用此类,在线程中(moveToThread 或者 局部线程QtConcurrent ),采用局部变量的方式。
遇到一个奇怪的问题, 在这个网络交互的类里面,析构函数中,采用delete 或 deleteLater 删除mManager ,在整个程序结束时(使用过程中不会),都会造成崩溃。测试采用非指针的QNetworkAccessManager类成员时也会出现这个问题,将new出来的QNetworkAccessManager* mManager父亲指定为网络交互类,也会有此类问题
注:这个网络交互类编译成dll了,作为app依赖库,在windows下DEBUG。返回的QNetworkReply经测试释不释放都不影响这个问题的出现,后续发现返回的QNetworkReply属于QNetworkAccessManager的子对象,因此当前是没有主动去释放的。
有大佬能指点一下为什么吗?
采用虚拟机进行win7、win8、win10 x32 x64 , win11 x64测试,发现这个问题只在debug模式下才会出现,因此这个问题不再理会,在这里结贴
根据你提供的信息,可能是因为在析构函数中使用delete或deleteLater删除mManager时,mManager已经被删除或者已经被释放,导致程序崩溃。
你可以尝试在析构函数中加入一些调试输出,查看mManager是否为空或者已经被释放。另外,你还可以尝试使用智能指针来管理mManager的生命周期,例如使用std::unique_ptr或者std::shared_ptr,避免手动管理指针的麻烦和潜在的内存泄漏问题。
另外,如果你的网络交互类是作为app依赖库编译的,建议你在程序结束时手动释放所有动态分配的内存,以避免内存泄漏问题。可以考虑在程序结束前调用QApplication::quit()或者QCoreApplication::exit()函数,等待程序退出前的所有事件循环结束,然后再手动释放所有动态分配的内存。