gpt4 book ai didi

c++ - Qt 应用程序在退出时崩溃,操作系统应用 "fault tolerant heap shim"

转载 作者:行者123 更新时间:2023-11-30 04:01:10 25 4
gpt4 key购买 nike

我无法找出导致应用程序在退出时崩溃的原因。更让人困惑的是,它并不总是崩溃,有时会崩溃,有时不会,而且它似乎完全是任意的。

该示例基本上创建了一个自定义图像提供程序,该提供程序将静态谷歌地图 API 请求加载为 PNG 图像以在 QML 中显示。图像提供者本身可以工作,我首先怀疑问题可能与在堆栈上实例化网络访问管理器有关,但事实并非如此,我在动态实例化它时得到了相同的行为。有趣的是,崩溃似乎并不对应于任何特定的东西。只是启动和关闭应用程序有时会导致崩溃,而无需与它进行任何交互,但它通常不会在没有任何交互的情况下崩溃。有时与 map 中心和缩放的多次交互不会导致退出时崩溃,但大多数情况下会崩溃。

另一个可疑点是我为了在网络请求完成时“阻止”图像提供程序方法而实例化的事件循环。由于图像提供者的设计,图像必须通过请求它的相同方法返回,换句话说,我不能使用“推荐”方法,即从方法启动请求并通过连接其 捕获它completed 信号到另一个方法。但这似乎也不是,因为提供商总是设法提供我认为没有问题的图像。至少不是直接的,但可能是网络访问的一些副作用?

顺便说一句,Qt 会发出一些警告,仅在首次使用网络访问管理器时出现。对于 Qt 5.2,我只有这四个:

QSslSocket: cannot resolve TLSv1_1_client_method
QSslSocket: cannot resolve TLSv1_2_client_method
QSslSocket: cannot resolve TLSv1_1_server_method
QSslSocket: cannot resolve TLSv1_2_server_method
QSslSocket: cannot resolve SSL_select_next_proto

...在升级到新的 5.3.1 后希望删除这些警告,实际上除了前四个之外还出现了两个:

QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb
QSslSocket: cannot resolve SSL_get0_next_proto_negotiated

也许这些警告与崩溃有某种关系?

这也是应用程序崩溃信息:

  Fault Module Name:    ntdll.dll
Fault Module Version: 6.1.7601.17725
Fault Module Timestamp: 4ec49b8f
Exception Code: c0000005
Exception Offset: 000332a0
OS Version: 6.1.7601.2.1.0.256.1
Locale ID: 1033
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

平台信息:Windows 7 x64,标准 32 位 Qt,使用 GCC 构建

相关代码如下:

C++

class MapReader : public QQuickImageProvider {
public:
explicit MapReader() : QQuickImageProvider(QQuickImageProvider::Pixmap, QQmlImageProviderBase::ForceAsynchronousImageLoading) { }

QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) {
QNetworkAccessManager m;
Q_UNUSED(requestedSize)
Q_UNUSED(size)
QEventLoop loop;
QObject::connect(&m, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));
QNetworkReply * r = m.get(QNetworkRequest(QUrl(id)));
loop.exec();

if (r->error()) {
qDebug() << "Error: " << r->errorString();
r->deleteLater();
return QPixmap();
}

QPixmap p;
p.loadFromData(r->readAll());
r->deleteLater();
return p;
}
};

QML

Rectangle {
id: root
width: 360
height: 360

property string url : 'image://map/http://maps.googleapis.com/maps/api/staticmap?center=' + n + ',' + e + '&zoom=' + zoom.value + '&size=' + width + "x" + height + '&maptype=satellite'
property real n : 48.858222
property real e : 2.2945

Timer {
id: t
repeat: false
interval: 100
running: false
onTriggered: {
placeholder.source = root.url
}
}

function refresh() { if (t.running) t.restart(); else t.start() }

Image {
id: placeholder
anchors.fill: parent
}

MouseArea {
anchors.fill: parent

onClicked: {
var xOffset = (mouseX / width - 0.5) * (360 / Math.pow(2, zoom.value))
var yOffset = (mouseY / height - 0.5) * (360 / Math.pow(2, zoom.value))

console.log(xOffset + " " + yOffset)

root.n = root.n - yOffset
root.e = root.e + xOffset
root.refresh()
}
}

Slider {
id: zoom
value: 17
maximumValue: 21
minimumValue: 1
stepSize: 1
x: 80
y: parent.height - 25
width: parent.width - 90

onValueChanged: root.refresh()
}
}

最佳答案

问题出在您的图像提供程序类中。我不确定确切的位置,但它在那里,因为没有它我无法重现崩溃。我之所以能够说出这一点,是因为您的案例中的图像提供程序完全没有必要 - QtQuick Image 元素将按原样接受并使用 Google API url 源。

关于c++ - Qt 应用程序在退出时崩溃,操作系统应用 "fault tolerant heap shim",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25932804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com