2010-10-04 50 views
2

我有一個symbian Qt應用程序接收GPS數據,將其存儲到數據庫並嘗試將其發佈到服務器。前兩步工作正常,但連續發佈要麼崩潰我的應用程序或殺死我的互聯網連接。連續上傳導致QNetworkReply錯誤「無法分配內存」

我已經修改了我的應用程序以進行調試,因此它只在每10秒內向服務器發佈數據。應用程序運行良好大約45-90分鐘沒有任何顯着的內存增加。

在那之後,我會得到QNetworkReply一個錯誤說「無法分配內存」
同一時間的內存使用增加大約63500(字節?)。
在接下來的上傳我會得到答覆,說「無效的socket描述符」,之後我QtCreator調試輸出充滿「異常在7會做setdefaultif(0) - 破解]」

有人知道這裏出了什麼問題嗎?我無法從我的上傳代碼中找到可能導致此問題的錯誤。

這是我的上傳腳本。

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:Memory full,...」(來自應用程序的網絡請求正常工作)我使用的是諾基亞能源分析器,它沒有顯示任何內存跡象已滿。即使測試了這一點,並開始了2場比賽,ovi地圖和其他大量應用程序,即使它們消耗了超過40MB的內存,它們也能正常運行。

回答

0

有人告誡說,我在Qt中做的唯一網絡代碼是在桌面平臺上,即使這樣我需要查看它,我沒有看到任何明顯的東西。我也知道在我自己的代碼中,deletelater()有時對於「後來的」比我有什麼不同的想法。我沒有時間查看它,可能在這裏是錯誤的,但我認爲deletelater()實際上是在事件線程上運行的,並且如果事件線程總是繁忙,那麼它何時有時間刪除該對象?出於調試目的,我會用delete刪除deletelater()(實際上,沒有理由使用deletelater(),除非您有需要清理的父/子關係,並且可能有一種手動刪除孩子從父母,所以你不需要擔心懸掛指針,當你打電話刪除)。

我也不知道你的內存消耗測試的準確性。分配的內存測試是否引用當前線程?目前的過程?程序是否從堆中獲得了「大塊」內存,它只是單獨管理,不允許使用多於?我認爲你比我更瞭解這個框架;這些只是你想要嘗試的一些想法。

+0

感謝您的回覆。忘了提及但是測試瞭如果回覆被刪除,並且它在requestFinished函數之後每次都執行。只有在函數調用之間運行的是具有10秒超時的QTimer。我認爲應用程序從用戶可以定義的堆中收到大量內存,用戶也可以設置最大數量的堆可以增長的大小。我不完全確定自己是否正確,因爲沒有太多處理內存問題 – Harmiih 2010-10-04 10:39:47