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