我需要有关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
是在头文件中声明为私有(private)字段的QTcpSocket*
。就功能而言,一切都很好。但是此套接字在发送每个消息时消耗越来越多的内存。这不是实际的泄漏,而是某种缓冲(与QIODevice文档相对应-QTcpSocket的注意事项)。 Docs还说,打开设备时可以使用Unbuffered模式。但这在QTcpSocket中是不可能的:
我应该如何避免呢?我知道
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 */
最佳答案
因此,如@MarekR所指出的,发生此“泄漏”的原因是没有从套接字读取数据。因此,QTcpSocket正在缓冲来自服务器的响应。从套接字检索传入的数据后,释放分配的内存。
关于c++ - QTcpSocket “leaks”内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22480651/