关于QSocket的释放的一个需要注意的情况
来源:互联网 发布:c语言char函数 编辑:程序博客网 时间:2024/06/11 18:59
最近在用QtNetwork编写服务器程序进行TCP/IP通信,大体过程如下:
1. 创建一个QTcpServer实例,监听目标IP和端口;
2. 一旦监听到有连接,获取和客户端之间的socket;
3. 使用socket进行通信;
4. 通信结束后,可以手动释放socket,也可以不管它,在释放QTcpServer的时候会把其下的所有socket全部自动释放。
在编写时,我做了如下事:
TcpNetwork::TcpNetwork(){ ... connect(mySocket, SIGNAL(disconnect(QTcpSocket*)), this, SLOT(ServerConnectionLost(QTcpSocket*))); ...}
TcpNetwork::~TcpNetwork(){ if (tcpServer != NULL) { delete tcpServer; }}
<pre name="code" class="cpp">void TcpNetwork::ServerConnectionLost(QTcpSocket *socket){ if (socket == mySocket) { ... // debug delete mySocket; mySocket = NULL; ... }}
如果将QTcpSocket::disconnect()信号与一个其中带有释放socket操作的槽连接起来,那么如果socket还没有关闭就直接析构QTcpServer,在执行断开socket这一步时(如果之前已经断开了就不会再执行这一步了)会触发带有删除socket操作的槽,然而析构函数对此一无所知,紧接着便是析构函数来释放socket,也就造成了socket的内存的重复释放,导致崩溃。
解决方法:在关闭窗口之前先关闭socket,这样在析构函数中就不会再执行关闭socket的操作。或者在连接断开时触发的含有释放socket操作的槽中将delete socket改为socket->deleteLater()。
0 0
- 关于QSocket的释放的一个需要注意的情况
- activity需要注意的情况
- yield在大循环中需要注意的一个情况
- 关于mschart在显示百分比时需要注意的情况
- 关于需要释放的调用
- 关于java的io一个需要注意的问题
- 关于vim文件格式的一个需要注意的地方
- 关于Qt中QMap的一个需要注意的地方
- 关于结构体初始化需要注意的一个细节
- 关于协方差矩阵需要注意的一个事项
- 关于实际使用https需要注意的一个小点
- 可重入锁的获取和释放需要注意的一点儿事
- TCP建立和释放原理和需要注意的问题
- 关于sizeof(特别注意指针的情况)
- js出现undefind的情况需要注意的几个问题
- 指针作为函数返回值需要注意的情况
- Svn 服务器 多项目管理 及需要注意的情况
- java中long值表达式需要注意的一种情况
- 黑马程序员-学习笔记-查漏补缺
- UITableviewController的创建以及关于多余分割线问题
- 字符串中的数字相加
- 依赖倒置原则 百科
- Play 1.2.x UnexpectedException ContinuationEnhancer on helpers.
- 关于QSocket的释放的一个需要注意的情况
- 客户端的IP地址伪造、CDN、反向代理、获取的那些事儿
- Java IO流->节点流->字节流:FileInputStream与FileOutputStream
- 通过代码自定义cell(cell的高度不一致)
- hdu 2426 Interesting Housing Problem(KM)
- 文件发送和接收-client 端/windows
- 如何设计Apple Watch上的App
- 《C程序员从校园到职场》带领大家从校园走向职场
- 组播,单播,广播,多播,泛洪的基本概念