QT网络崩溃
QT Networking Crashes
我在访问网络请求的回复对象时得到了sigsegv。如果我这样做,它可以正常工作:
QNetworkAccessManager manager;
/**
* Main entry point.
*/
int main(int argc, char *argv[])
{
Configuration configuration;
QApplication a(argc, argv);
MainWindow w;
w.show();
QNetworkRequest * req = new QNetworkRequest(QUrl("http://localhost:5000/status/health"));
QNetworkReply * reply = manager.get(*req);
QObject::connect(reply, &QNetworkReply::finished, [&]{
QByteArray read = reply->readAll();
std::string readStr = read.toStdString();
std::cout << "Got reply: " << readStr << endl;
reply->close();
reply->deleteLater();
});
return a.exec();
}
,但这会做一个sigsegv:
QNetworkAccessManager manager;
void doRequest() {
QNetworkRequest * req = new QNetworkRequest(QUrl("http://localhost:5000/status/health"));
QNetworkReply * reply = manager.get(*req);
QObject::connect(reply, &QNetworkReply::finished, [&]{
QByteArray read = reply->readAll();
std::string readStr = read.toStdString();
std::cout << "Got reply: " << readStr << endl;
reply->close();
reply->deleteLater();
});
}
/**
* Main entry point.
*/
int main(int argc, char *argv[])
{
Configuration configuration;
QApplication a(argc, argv);
MainWindow w;
w.show();
doRequest();
return a.exec();
}
所以有些范围掉了。我不知道什么。所以我这样做了:
static QNetworkReply * reply;
void doRequest() {
QNetworkRequest req(QUrl("http://localhost:5000/status/health"));
reply = manager.get(req);
QObject::connect(reply, &QNetworkReply::finished, [&]{
QByteArray read = reply->readAll();
std::string readStr = read.toStdString();
std::cout << "Got reply: " << readStr << endl;
reply->close();
reply->deleteLater();
});
}
这不是sigsegv。而且我不知道为什么不。
我真的很愚蠢地对Lambdas如何使用[&amp;]?还是对qnetworkreply对象的真正是是神奇的?这真的是一个明智的指针,因为它脱离了范围,因此被摧毁了吗?
有人有指向右从我的GUI中调用网络函数的方法吗?我正在执行所有操作以使此操作以在单击按钮上工作。也许我需要自己保留答复对象,而忘记了它们在那个lambda中。我不知道。我发现的示例都是独立的,就像我的原始代码一样。
lambdas中的[&amp;]符号确实很危险。特别是在异步环境中。
所以我要告诉你为什么:
QNetworkReply * reply = manager.get(*req);
QObject::connect(reply, &QNetworkReply::finished, [&]{
QByteArray read = reply->readAll();
std::string readStr = read.toStdString();
std::cout << "Got reply: " << readStr << endl;
reply->close();
reply->deleteLater();
});
您是通过参考捕获回复指针。在示波器结束时,回复指针被破坏,您可以提及垃圾。
解决方案是按值捕获回复指针:
QNetworkReply * reply = manager.get(*req);
QObject::connect(reply, &QNetworkReply::finished, [reply]{
QByteArray read = reply->readAll(); // Works well, it's a fresh copy of the pointer
std::string readStr = read.toStdString();
std::cout << "Got reply: " << readStr << endl;
reply->close();
reply->deleteLater();
});
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 我的神经网络不起作用 [XOR 问题]
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 通过网络、跨平台传递std::变体是否安全
- 如何在MNIST上提高网络运行的准确性
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- Active Directory:从网络服务帐户下运行的Windows服务调用ADsOpenObject时失败
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- QT网络崩溃
- Qt 网络引擎调试版本崩溃
- OpenCV在imShow上崩溃仅适用于USB网络摄像头
- 使用Qt Commercial(qmake+jom)编译的snmp网络库崩溃