qt QNetworkAccessManager下载大文件后出现内存泄漏,求大神指点

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

使用qt QNetworkAccessManager下载大文件后并写入文件,通过free查看系统内存会增加,通过echo 3 > /proc/sys/vm/drop_caches清除缓存仍无效果,请大神指点,可能出现的问题在哪里?

一、步骤

1.下载

代码如下(示例):
void download(QString url)
{

fileReply = fileNetMgr->get(request);

    fd = open("/mnt/app/Download/1.pdf",O_RDWR | O_SYNC | O_APPEND | O_CREAT, 0666);
    connect(fileReply, SIGNAL(readyRead()), this, SLOT(onReadyRead()),Qt::QueuedConnection);
    connect(fileReply, SIGNAL(finished()), this, SLOT(onFinished()),Qt::QueuedConnection);
    connect(fileReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError)));
}

2.写文件

代码如下(示例):
void onReadyRead()
{
if(pfContentLength == 0){
pfContentLength = fileReply->header(QNetworkRequest::ContentLengthHeader).toLongLong();
}
QByteArray data = fileReply->readAll();
write(fd,data.data(),data.size());
pfReceivedSize += data.size();
}

void onFinished()
{
if(pfContentLength == 0){
pfContentLength = fileReply->header(QNetworkRequest::ContentLengthHeader).toLongLong();
}

    QByteArray data = fileReply->readAll();
    write(fd,data.data(),data.size());
    pfReceivedSize += data.size();

    if(pfReceivedSize == pfContentLength && pfContentLength != 0){
		close(fd);
		fileReply->deleteLater();
		dropCache();
        m_finished = true;
    }
}

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

DlTest* t = new DlTest;
QString url = argv[1];

t->download(url);
QProcess p;
while(true)
{
    if(t->finished())
    {
        t->memInfo();
        delete t;
       
        QString cmd = "/bin/sh -c free";
        p.start(cmd);
        p.waitForFinished();
        qDebug() << p.readAllStandardOutput();
        break;
    }
    else
    {
        QCoreApplication::processEvents();
    }
}
return a.exec();

}

总结

求大神指点 !!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用QNetworkAccessManager下载文件Qt代码示例,您可以参考: ```cpp #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> #include <QFile> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建QNetworkAccessManager对象 QNetworkAccessManager manager; // 创建网络请 QNetworkRequest request(QUrl("https://www.example.com/file.txt")); // 发送网络请并获取QNetworkReply对象 QNetworkReply *reply = manager.get(request); // 连接QNetworkReply的finished信号,下载完成后进行处理 QObject::connect(reply, &QNetworkReply::finished, [&](){ // 如果下载成功 if(reply->error() == QNetworkReply::NoError){ // 保存文件 QFile file("file.txt"); file.open(QIODevice::WriteOnly); file.write(reply->readAll()); file.close(); qDebug() << "Download finished."; } // 如果下载失败 else{ qDebug() << "Download failed:" << reply->errorString(); } // 释放QNetworkReply对象 reply->deleteLater(); // 退出应用程序 QCoreApplication::quit(); }); // 开始Qt事件循环 return a.exec(); } ``` 在这个示例中,我们创建了一个QNetworkAccessManager对象来处理网络请,然后创建了一个QNetworkRequest对象来指定要下载文件的URL。接着,我们使用QNetworkAccessManager的get()方法发送网络请,并获取了一个QNetworkReply对象。 我们使用QObject::connect()方法连接了QNetworkReply的finished信号,这样在下载完成后会执行我们指定的Lambda函数。在这个Lambda函数中,我们首先判断下载是否成功,如果成功就将文件保存到本地。否则,我们打印出错误信息。最后,我们释放QNetworkReply对象并退出应用程序。 请注意,由于这个示例中我们使用了Qt事件循环,所以在下载完成后应该调用QCoreApplication::quit()方法来退出事件循环并结束应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值