首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTcpSocket内存泄漏

QTcpSocket内存泄漏
EN

Stack Overflow用户
提问于 2013-10-04 00:47:39
回答 2查看 1.1K关注 0票数 1

我有一个使用QTcpServer和QTcpSockets的客户机-服务器应用程序设置,似乎有一些巨大的内存泄漏。我想知道问题是否出在Qt套接字的使用上,因为我刚刚设置了一个简单的测试应用程序,在循环发送了250,000,000条消息后,我的客户端会上升到75兆。似乎如果我有几百万条消息,我看到我的客户端使用了300+ MB的内存。

这对我来说似乎不太对,因为我一直在发送消息,而内存却一直在上升!

因此,我应该期望我的应用程序在连接的套接字上提供以下代码时,内存会不断增加。如果此套接字保持打开状态,我将很快耗尽内存。我是不是遗漏了什么?

代码语言:javascript
复制
if (socket && socket->isOpen())
{
    for(int i = 0; i < 25000000; ++i) {
        QString str = "test";
        socket->write(str.toStdString().c_str());
    }
}
EN

回答 2

Stack Overflow用户

发布于 2013-10-04 03:35:50

这是意料之中的,因为您可能会缓冲大量数据。由于Qt事件循环,这是一个异步API,所以当程序准备好写入时,您应该等待写入。

您可以使用void QIODevice::bytesWritten(qint64 bytes) [signal]信号继续写入。如果您以这种方式使用异步API,您将避免大量的内存消耗。

票数 2
EN

Stack Overflow用户

发布于 2013-10-04 22:21:33

套接字是一个内部缓冲的QIODevice,您向其写入的任何内容都会被缓冲,直到网络堆栈能够真正将其发送出去。您看到的是预期行为。write()不是一个阻塞操作,而且无论如何你都不应该在你的GUI线程中做阻塞操作,除非你认为用户真的喜欢死用户界面的应用程序。

也许你想把你写的东西放在一个插槽中,这样就可以得到套接字的进度信息了?套接字都是QIODevice。在那里寻找有用的信号,例如bytesWritten()。除非bytesToWrite()返回的值低于设定的阈值,否则通常会延迟写入。你的写作时段可能是这样开始的:

代码语言:javascript
复制
// more than 2 pages worth of stuff still to send, we abstain
if (socket->bytesToWrite() > 1<<13) return; 

吹毛求疵:toStdString()是完全严重的。您应该使用:

代码语言:javascript
复制
socket->write(str.toUtf8().constData());

请不要介意,对于这样的测试,您可以简单地创建一个字节数组,而根本不使用字符串:

代码语言:javascript
复制
const QByteArray testData(1000, ' '); // a 1000 spaces
for (int i = 0; i < 100000; ++i) socket->write(testData);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19164770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档