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

时间:2010-10-04 07:42:07

标签: qt qnetworkaccessmanager

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

我已经修改了我的应用程序以进行调试,所以它只会在每10秒向服务器发布一次数据。应用程序运行良好约45-90分钟,没有任何显着的内存增加。

之后,我将从QNetworkReply收到错误 “无法分配内存”
同一时间内存使用量增加大约63500(字节?) 在下次上传时,我会得到 “无效的套接字描述符” 的回复,然后我的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 个答案:

答案 0 :(得分:0)

需要注意的是,我在Qt中使用的唯一网络代码是在桌面平台上,即使这样我也需要查找,我看不出任何明显的东西。我也知道,在我自己的代码中,deletelater()有时会对“后来”的看法有所不同。我没时间查找它可能在这里错了,但我认为deletelater()实际上是在事件线程上运行的,如果你的事件线程总是忙,那么它什么时候有时间删除对象?出于调试目的,我会用delete替换deletelater()(实际上,除非你有一个需要清理的父/子关系,否则没有理由使用deletelater(),并且可能有办法手动删除来自父母的孩子,所以当你打电话给删除时你不必担心悬空指针。

我也不知道你的内存消耗测试的准确性。分配的内存测试是否引用当前线程?目前的流程?一个程序是否从堆中获得了一大块内存,它只是管理器本身而且不允许使用超过?我想你比我更了解这个框架;这些只是你尝试的一些想法。