连续上传导致 QNetworkReply 错误“无法分配内存”

Posted

技术标签:

【中文标题】连续上传导致 QNetworkReply 错误“无法分配内存”【英文标题】:Continuous uploading causes QNetworkReply error "Cannot allocate memory" 【发布时间】:2010-10-04 07:42:07 【问题描述】:

我有一个用于 symbian 的 Qt 应用程序,它接收 gps 数据,将其存储到数据库中并尝试将其发布到服务器。前两个步骤可以正常工作,但连续发布会使我的应用程序崩溃或中断我的互联网连接。

出于调试目的,我修改了我的应用程序,因此它仅每 10 秒向服务器发送一次数据。应用程序运行良好约 45-90 分钟,没有任何显着的内存增加。

之后,我会从 QNetworkReply 收到一条错误消息,提示 “无法分配内存”。 同时内存使用量增加了大约 63500(字节?)。 在下一次上传时,我会收到回复说 "Invalid socket descriptor",然后我的 QtCreator 调试输出被 "7 上的异常填充 [会做 setdefaultif(0) - hack]"

有人知道这里出了什么问题吗?我无法从我的上传代码中找到可能导致此问题的错误。

这是我的上传脚本。

void MainWindow::upload() 
    //Content of postData below. Using same data on every upload now when tracking the bug
    //["timestamp":"2010-10-01T17:10:27","latitude":62.1823321,"longitude":25.73226825,"user":6]
    QByteArray postData; 

    QNetworkRequest request;
    request.setUrl(uploadUrl);
    this->qnam->post(request, postData);


void MainWindow::serviceRequestFinished(QNetworkReply* reply) 
    QByteArray bytes = reply->readAll();

    if (reply->error() == QNetworkReply::NoError)
    
         //nothing in here when debugging
     else 
        qDebug() << "-------Reply error: " + reply->errorString();
    

    reply->deleteLater();
    updateHeapStats();


void MainWindow::updateHeapStats()  
#ifdef Q_OS_SYMBIAN
        TInt mem, size, limit;
        User::Heap().AllocSize(mem);
        size = User::Heap().Size();
        limit = User::Heap().MaxLength();
        qDebug() << "**DEBUG MEMORY - > Memory:     " << QString::number(mem);
        qDebug() << "**DEBUG MEMORY - > Heap limit: " << QString::number(limit);
        qDebug() << "**DEBUG MEMORY - > Heap size:  " << QString::number(size);
#endif

差点忘了,我用诺基亚 N97mi​​ni、5230 和 5800 测试过,它们的表现都一样。

编辑。忘了提到当互联网连接“死”时,我仍然可以看到 3G 已打开,但使用网络浏览器连接到互联网失败。当我关闭应用程序并尝试使用浏览器连接到互联网时,它显示“Web:内存已满,...”(来自应用程序的 Web 请求工作正常)我正在使用诺基亚能源分析器,它没有显示任何内存迹象满。甚至对此进行了测试并启动了 2 个游戏、ovi 地图和大量其他应用程序,即使它们消耗了超过 40MB 的内存,它们也能正常工作。

【问题讨论】:

【参考方案1】:

需要注意的是,我在 Qt 中执行的唯一网络代码是在桌面平台上,即使这样我也需要查找它,但我看不到任何明显的东西。我也知道,在我自己的代码中,deletelater() 有时对“稍后”是什么有不同的想法。没时间查,这里可能有错,但是我觉得deletelater()其实是在事件线程上运行的,如果你的事件线程一直很忙,什么时候才有时间删除对象呢?出于调试目的,我会将 deletelater() 替换为 delete (实际上,没有理由使用 deletelater() 除非您有需要清理的父/子关系,并且可能有一种手动删除的方法来自父级的子级,因此您在调用 delete 时无需担心悬空指针)。

我也不知道你的内存消耗测试的准确性。分配的内存测试是否引用当前线程?目前的流程?程序是否从堆中收到了它自己管理的“块”内存,并且不允许使用更多?我认为你比我更了解这个框架;这些只是您可以尝试的一些想法。

【讨论】:

感谢您的回复。忘了提及,但测试了回复是否被删除,并且每次在 requestFinished 函数之后都会这样做。函数调用之间唯一运行的是 QTimer,超时时间为 10 秒。我认为应用程序从用户可以定义的堆中接收大块内存,用户还可以设置最大堆可以增长多少。我不完全确定我是否正确,因为没有太多处理内存问题

以上是关于连续上传导致 QNetworkReply 错误“无法分配内存”的主要内容,如果未能解决你的问题,请参考以下文章

错误:QNetworkReply:没有这样的文件或目录

QnetworkReply 错误 - Symbian Qt

连接丢失时未检测到 QNetworkReply 错误信号

获取简单 URL 时出现 QNetworkReply 错误“连接已关闭”

如何增加 QNetworkReply::downloadProgress 信号频率?

QNetworkReply::error 信号何时会跟随finished() 信号?