【发布时间】:2019-07-29 10:11:00
【问题描述】:
我编写了简单的 Http 服务器(仅用于获取和解析请求)。 但它似乎无法正常工作:有时我收到错误“访问冲突(c0000005)”
UPD:我已遵循建议并更改了来源:
Server::Server()
{
tcpServer = new QTcpServer();
if (!tcpServer->listen(QHostAddress::Any, 1111)) {
return;
}
QObject::connect(tcpServer, &QTcpServer::newConnection, [=]() {
QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
QObject::connect(clientSocket, &QTcpSocket::disconnected, clientSocket, &QTcpSocket::deleteLater);
QObject::connect(clientSocket, &QTcpSocket::readyRead, [this, clientSocket]() {
const QString line = QUrl::fromPercentEncoding(clientSocket->readLine());
clientSocket->disconnectFromHost();
const QStringList tokens = QString(line).split(QRegExp("[ \r\n][ \r\n]*"));
if (parseParams(tokens)) {
emit Server::newRequest(params);
}
});
});
}
此代码永远不会抛出错误“访问冲突 (c0000005)”吗?
【问题讨论】:
-
您正在通过引用捕获堆栈变量
alreadyDeleted,但堆栈帧很快就消失了(在两次调用连接之后)。无论如何你都不需要它,因为如果对象已经被销毁(销毁断开信号处理程序),处理程序将无法触发。 -
unique_ptr 会解决这个问题吗?
-
完全摆脱
alreadyDeleted变量。你不需要它。 -
在这种情况下 deleteLater() 将被调用几次...
-
每个断开连接的套接字都应该调用 1。对于已断开连接的套接字,您不应获得额外的断开连接信号。
标签: c++ qt qtcpsocket qtnetwork qtcpserver