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

QTcpSocket“泄漏”内存
EN

Stack Overflow用户
提问于 2014-03-18 13:19:56
回答 2查看 1.1K关注 0票数 1

我需要帮助处理QTcpSocket不断增长的记忆。

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

我编写了一个封装QTcpSocket的简单类

代码语言:javascript
复制
#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*声明为头文件中的私有字段。

在功能方面,一切都很好。但是,这个套接字消耗了越来越多的记忆,每发送一条消息。这不是一个实际的泄漏,而是某种类型的缓冲(与QIODevice文档对应--QTcpSocket注释)。Docs还说,在打开设备时,可以使用非缓冲模式。但这在QTcpSocket中是不可行的:

注意:不能在QIODevice::Unbuffered模式下打开TCP套接字。

我该怎么避免呢?我知道waitForBytesWritten()应该这么做,但它显然不是。

主类如下所示:

代码语言:javascript
复制
#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;
}

我的头文件如下。

代码语言:javascript
复制
#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 */
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-25 14:14:57

因此,正如@MarekR所指出的,这种“泄漏”的原因不是从套接字中读取。因此,QTcpSocket正在缓冲来自服务器的响应。此分配的内存是在从套接字中撤回传入数据后释放的。

票数 1
EN

Stack Overflow用户

发布于 2014-03-18 15:06:21

,需要两次才能探戈。,您一直将其写入套接字,同时忽略连接的另一端是否从所述套接字读取了任何内容。

由您单独负责写缓冲区的增长。您应该检查写缓冲区的大小(可以通过bytesToWrite获得),如果过了合适的阈值,就停止对套接字的写入。

它绝对没有魔力:只有你,只有你,才能让缓冲器生长。

正如bytesToWrite所指出的,写入缓冲区的增长表明您的写入速度比另一方读取数据的速度要快。造成这种情况的原因有多种,例如:

  • 慢通讯频道,
  • 实现不好的服务器。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22480651

复制
相关文章

相似问题

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