我需要帮助处理QTcpSocket不断增长的记忆。
当然,我也发现了类似的问题-- here、here和here,但不幸的是,他们并没有为我解决这个问题。
我编写了一个封装QTcpSocket的简单类
#include "GWCommunicator.h"
GWCommunicator::GWCommunicator() {
socket = new QTcpSocket(this);
}
bool GWCommunicator::send(const char *data, qint64 size) {
socket->write(data, size);
return socket->waitForBytesWritten();
}
GWCommunicator::~GWCommunicator() {
delete socket;
}
bool GWCommunicator::connectToServer() {
socket->connectToHost(SERVERIP, 6498, QIODevice::ReadWrite);
return socket->waitForConnected();
}
bool GWCommunicator::disconnectFromServer() {
socket->disconnectFromHost();
return socket->waitForDisconnected();
}其中socket被QTcpSocket*声明为头文件中的私有字段。
在功能方面,一切都很好。但是,这个套接字消耗了越来越多的记忆,每发送一条消息。这不是一个实际的泄漏,而是某种类型的缓冲(与QIODevice文档对应--QTcpSocket注释)。Docs还说,在打开设备时,可以使用非缓冲模式。但这在QTcpSocket中是不可行的:
注意:不能在QIODevice::Unbuffered模式下打开TCP套接字。
我该怎么避免呢?我知道waitForBytesWritten()应该这么做,但它显然不是。
主类如下所示:
#include "GWCommunicator.h"
#include <iostream>
using namespace std;
GWCommunicator *communicator;
int main(/*int argc, char *argv[]*/) {
communicator = new GWCommunicator();
communicator->connectToServer();
string stdstr("Hello world");
const char* str = stdstr.c_str();
int count = 0;
int length = stdstr.size();
while (count++ < 10000) {
communicator->send(str, length);
}
communicator->disconnectFromServer();
delete communicator;
return 0;
}我的头文件如下。
#include <QObject>
#include <QTcpSocket>
#ifndef GWCOMMUNICATOR_H
#define GWCOMMUNICATOR_H
#define SERVERIP "127.0.0.1"
class GWCommunicator : private QObject {
Q_OBJECT
public:
GWCommunicator();
~GWCommunicator();
bool connectToServer();
bool disconnectFromServer();
bool send(const char *datam, qint64 size);
private:
QTcpSocket *socket;
};
#endif /* GWCOMMUNICATOR_H */发布于 2014-03-25 14:14:57
因此,正如@MarekR所指出的,这种“泄漏”的原因不是从套接字中读取。因此,QTcpSocket正在缓冲来自服务器的响应。此分配的内存是在从套接字中撤回传入数据后释放的。
发布于 2014-03-18 15:06:21
,需要两次才能探戈。,您一直将其写入套接字,同时忽略连接的另一端是否从所述套接字读取了任何内容。
由您单独负责写缓冲区的增长。您应该检查写缓冲区的大小(可以通过bytesToWrite获得),如果过了合适的阈值,就停止对套接字的写入。
它绝对没有魔力:只有你,只有你,才能让缓冲器生长。
正如bytesToWrite所指出的,写入缓冲区的增长表明您的写入速度比另一方读取数据的速度要快。造成这种情况的原因有多种,例如:
https://stackoverflow.com/questions/22480651
复制相似问题