gpt4 book ai didi

c++ - QTcpSocket "leaks"内存

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:50 25 4
gpt4 key购买 nike

我需要有关QTcpSocket 不断增长的内存方面的帮助。

我当然也找到过类似的问题here , herehere ,但不幸的是,他们没有为我解决这个问题。

我写了一个简单的类封装了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();
}

其中socketQTcpSocket*在头文件中声明为私有(private)字段。

在功能方面,一切都很好。但是这个套接字随着每条消息的发送消耗越来越多的内存。这不是真正的泄漏,而是某种缓冲(对应于 QIODevice 文档 - QTcpSocket 的注释)。文档还说您可以在打开设备时使用无缓冲模式。但这在 QTcpSocket 中是不可能的:

Note: TCP sockets cannot be opened in QIODevice::Unbuffered mode.

我该如何避免呢?我知道 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com