C++ QTcpSocket“;“泄漏”;记忆

C++ QTcpSocket“;“泄漏”;记忆,c++,qt,memory-leaks,qtcpsocket,C++,Qt,Memory Leaks,Qtcpsocket,我需要有关QTcpSocket的上升内存的帮助 当然,我也发现了类似的问题,但不幸的是,它们并没有为我解决这个问题 我编写了一个简单的类,它封装了qtcsocket: #include "GWCommunicator.h" GWCommunicator::GWCommunicator() { socket = new QTcpSocket(this); } bool GWCommunicator::send(const char *data, qint64 size) {

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

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

我编写了一个简单的类,它封装了
qtcsocket

#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
在头文件中声明为私有字段

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

注意:无法在QIODevice::Unbuffered模式下打开TCP套接字

我应该如何避免它?我知道
waitforbytesswrited()
应该这样做,但显然不行

主类如下所示:

#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;
}
#包括“GWCommunicator.h”
#包括
使用名称空间std;
GWCommunicator*communicator;
int main(/*int argc,char*argv[]*/){
通信器=新的GWCommunicator();
通信器->连接到服务器();
字符串stdstr(“你好世界”);
const char*str=stdstr.c_str();
整数计数=0;
int length=stdstr.size();
而(计数+++<10000){
通信器->发送(str,长度);
}
通信器->断开与服务器的连接();
删除通信器;
返回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 */
#包括
#包括
#ifndef GWU H
#定义gwh
#定义SERVERIP“127.0.0.1”
类别:专用QObject{
Q_对象
公众:
GWCommunicator();
~gw();
bool connectToServer();
bool disconnectFromServer();
bool send(常量字符*datam,大小为64);
私人:
QTcpSocket*插座;
};
#endif/*gwu\H*/

探戈需要两个人。您一直在向套接字中写入数据,而忽略连接的另一端是否从所述套接字读取了任何数据

写入缓冲区的增长完全由您负责。您应该检查写入缓冲区的大小(可通过
bytesToWrite
获得),如果超过某个您认为合适的阈值,则停止向套接字写入

它绝对没有魔力:你,只有你,使缓冲区增长

写入缓冲区的增长,如
bytesToWrite
所示,表明您的写入速度比另一端读取数据的速度快。这可能有多种原因,例如:

  • 慢速通信信道

  • 服务器实现不好


正如@MarekR所指出的,“泄漏”的原因是插座没有读数。因此,QTcpSocket正在缓冲来自服务器的响应。从套接字检索传入数据后,将释放此分配的内存。

您确定内存泄漏是由
qtcsocket
引起的,而不是由您的代码引起的吗?例如,您可能忘记释放传递给
GWCommunicator::send()
const char*数据,或者类似的内容。要检查
qtcsocket
是否泄漏,请尝试创建一个只写入套接字的测试程序,然后启动它并读取其输出,看看它是否增加了内存。如果有,将该测试程序作为SSCCE发布。我还注意到,在您的用户配置文件中有Java标记,如果您主要是一名Java程序员,很可能您忘记了释放某些内容。如果您将父对象传递给socket的构造函数,您不需要
删除它,因为您有一个doubledelete@Kousalik不过,您是否创建了SSCCE并对其进行了测试?如果是这样的话,把它贴出来。@Kousalik啊,那么就没有错误了,只有错误的错觉。数据确实是缓冲的,但一旦从套接字读取数据,它就会从缓冲区中删除。如果您只是“发送”连接另一端从未读取的数据,它当然会累积,等待。如果数据实际上正在读取,您能否重现泄漏?尝试使用
netcat
这是一个免费工具。您如何知道内存泄漏?你用了什么工具?您如何知道每次通过套接字发送内容时内存消耗都会增加?那么服务器响应呢?我看不到您的代码中有任何内容?服务器是基于Java的生产级应用程序,工作非常好,可以立即接收我发送给它的每一条消息。我可以在我的应用程序中等待多长时间,但缓冲区保持满。有进一步的想法吗?我还双重检查了bytesToWrite及其零。