C++ 无法在std::shared\u ptr中保存QQmlContext

C++ 无法在std::shared\u ptr中保存QQmlContext,c++,qt,stl,qml,shared-ptr,C++,Qt,Stl,Qml,Shared Ptr,在使用Qt5.15/C++时,我注意到一些非常奇怪的行为 当我想为我的根上下文设置上下文属性时,我正在处理一个小应用程序 我的应用程序是一个QtQuick应用程序,它使用QQmlApplicationEngine而不是QQuickView(无论出于何种原因,创建Qt Quick应用程序时默认使用该应用程序): QQmlApplicationEngine; const-QUrl-url(QStringLiteral(“qrc:/main.qml”); // ... QStringList入口列表{

在使用Qt5.15/C++时,我注意到一些非常奇怪的行为

当我想为我的根上下文设置上下文属性时,我正在处理一个小应用程序

我的应用程序是一个QtQuick应用程序,它使用
QQmlApplicationEngine
而不是
QQuickView
(无论出于何种原因,创建Qt Quick应用程序时默认使用该应用程序):

QQmlApplicationEngine;
const-QUrl-url(QStringLiteral(“qrc:/main.qml”);
// ...
QStringList入口列表{“String1”、“String2”、“String3”};
然后,在将字符串列表指定为根上下文的上下文属性时,我希望使用STL共享指针而不是原始指针:

std::shared_ptr context=std::make_shared(engine.rootContext());
如果(!上下文){
qDebug()setContextProperty(“entryList”,QVariant::fromValue(entryList));
在QML中,我的条目列表将为空

但是,当我使用原始指针时:

QQmlContext*context=engine.rootContext();
// ...
一切工作正常,
entryList
var在QML中填充

这背后是否有我还不明白的逻辑行为?

顺便说一句,当使用
QSharedPointer
s而不是
shared\u ptr
时,列表将被填充,但是我在退出时遇到调试器异常:

0x7ff8022f2933处出现异常,代码:0xc0000005:0xFFFFFFFFFFFFFF处的读取访问冲突,标志=0x0(第一次机会)


Qt清楚地指示开发人员何时必须管理对象的内存,如果它没有指示,则必须假定Qt将在必要时消除它

在此特定情况下,QQmlContext由QQmlApplicationEngine创建,因此该类负责管理其内存。例如,QNetworkAccessManager是另一种情况,即在文档中,它指示开发人员必须处理创建的QNetworkReply()的内存:

注意:请求完成后,用户有责任在适当的时间删除QNetworkReply对象。不要直接在连接到finished()的插槽中删除它。您可以使用deleteLater()函数


Qt负责的内存管理可以通过QObject层次结构完成,也可以使用它自己的指针(QPointer、QSharedPointer等)但这与开发人员无关,因为这是专用Qt API的一部分。

在很多情况下,使用Qt时,当您创建某个实例时,其所有权通常会转移到其父实例,因此您会发现不需要自己管理生命周期。如果使用共享ptr,可能会出现双重删除,因为(在清理时)QmlEngine将删除所有上下文,然后当共享ptr refcount达到零时,该上下文将再次被删除。@Den Jason那么这是否意味着我不必为这些指针进行内存管理,例如,调用
delete
resp.将信号连接到
deleteLater()
slot?@taiBsu如果对象有父对象,则无需使用delete或delete later,因为这是父对象的工作。非常感谢您指出这一点。您中的任何人是否能够根据这些信息对这个问题给出雄辩的答案,以便我为该问题设置解决方案?@taiBsu注意,引擎创建了“context”,所以你不认为这个类处理它的内存吗?Qt在文档中明确指出,当它不处理内存时,比如当QNetworkManager返回QNetworkReply时