请教高手指点 QTcpServer 应用的问题,出现内存泄漏
测试平台为XP系统:
我的思想如下:自己重继承了 QTcpServer 类,
重定义了函数void incomingConnection(int socketDescriptor),
在此函数中自己定义了一个信号,为了获得socketDescriptor的值,
以后自己创建 QTcpSocket 连接时用。把QTcpSocket从QTcpServer中拿出来。
新类名为 myQTcpServer.
创建了自己的类 myQTcpServer 的一个对象,然后总是监听本机的端口9999,
如果有新的连接,就读取新连接的IP和端口号进行显示,然后断开连接。
当客户端,连接次数多了以后,大约几十次,发现程序的内存会慢慢的一直变大。
不知道为什么,有什么方法,可以解决此问题。希望高手指点,在此先谢谢了!
完整测试代码如下:
//主程序
//================================================
//main.cpp
#include <QtGui/QApplication>
#include "tcpserver.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
mytesttcpserver tcp;
tcp.show();
return a.exec();
}
//================================================
//tcpserver.h
#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <QtGui>
#include <QDialog>
#include <QTcpServer>
QT_BEGIN_NAMESPACE
class QString;
class QLabel;
class QLineEdit;
//net
class QHostInfo;
class QHostAddress;
class QNetworkAddressEntry;
class QTcpSocket;
QT_END_NAMESPACE
//对 QTcpServer 类扩展了一个信号
class myQTcpServer :public QTcpServer
{
Q_OBJECT
public:
myQTcpServer(QObject *parent = 0);
signals:
void mysignalincomingConnection(int socketDescriptor);
protected:
void incomingConnection(int socketDescriptor);
};
//tcp server
class mytesttcpserver :public QDialog
{
Q_OBJECT
public:
mytesttcpserver(QWidget *parent = 0);
public slots:
void slotincomingConnection(int socketDescriptor);
private:
QLabel *label;
QLineEdit *lineEditText;
myQTcpServer *tcpserver;
quint16 port;
int socket_count;
};
#endif // TCPSERVER_H
//================================================
//tcpserver.cpp
#include "tcpserver.h"
#include <QString>
#include <QDebug>
#include <QList>
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QVariant>
//net
#include <QHostInfo>
#include <QHostAddress>
#include <QNetworkAddressEntry>
#include <QNetworkInterface>
#include <QTcpSocket>
#include <QTcpServer>
myQTcpServer :: myQTcpServer(QObject *parent)
:QTcpServer(parent)
{
;
}
void myQTcpServer :: incomingConnection(int socketDescriptor)
{
emit mysignalincomingConnection(socketDescriptor);
}
mytesttcpserver :: mytesttcpserver(QWidget *parent)
:QDialog(parent)
{
setWindowTitle(tr("TCP server Test"));
QVBoxLayout *vbMain=new QVBoxLayout(this);
label=new QLabel(this);
label->setText(tr("Client Info:"));
vbMain->addWidget(label);
lineEditText=new QLineEdit(this);
vbMain->addWidget(lineEditText);
this->resize(300,100);
socket_count=0;
port=9999; //端口
//建立一个自己类的TCP服务
tcpserver=new myQTcpServer;
//启用监听端口
bool tcplisten;
tcplisten=tcpserver->listen(QHostAddress::Any,port);
if(tcplisten)
{
lineEditText->setText("listened!");
connect(tcpserver,SIGNAL(mysignalincomingConnection(int)),this,SLOT(slotincomingConnection(int)));
}
else
{
lineEditText->setText("error!");
return;
}
}
//有客户端连接过来
void mytesttcpserver :: slotincomingConnection(int socketDescriptor)
{
QTcpSocket testTcpSocket;
testTcpSocket.setSocketDescriptor(socketDescriptor);
//显示连接次数,远程主机IP和端口
socket_count++;
QVariant vcount(socket_count);
QVariant vport(testTcpSocket.peerPort());
QString msg;
msg="count:"+vcount.toString()+" IP:"+testTcpSocket.peerAddress().toString()+" port:"+vport.toString();
lineEditText->setText(msg);
testTcpSocket.disconnectFromHost();
testTcpSocket.close();
testTcpSocket.abort();
}
//========================================================