我需要有关QTcpSocket的上升内存的帮助。

当然,我发现了类似的问题hereherehere,但是不幸的是,它们并没有为我解决这个问题。

我写了一个简单的类,封装了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/

10-11 14:06