提问人:Johannes Schaub - litb 提问时间:1/16/2023 更新时间:1/16/2023 访问量:91
gsl::owner 是否可用于共享所有权?
Is gsl::owner usable for shared-ownership?
问:
例如,它可以在Qt中用于以下用途吗?
gsl::owner<QWidget*> w{new QWidget{parent}}
在此示例中,所有权由 new-site 和 共享,因为拥有 -ed 对象的代码可以 ,而 的析构函数将自身从子列表中取出。但是,如果未在新站点上删除,则将在其析构函数中删除它。parent
new
delete
w
W
parent
w
parent
- 这是共享所有权的一个例子吗,以及
- 可以用于吗?
gsl::owner
答:
2赞
Caleth
1/16/2023
#1
这是共享所有权的一个例子吗
不,您有两个地方声称拥有独特的所有权。
可用于它
gsl::owner
如果 可以比 所指向的对象存活,则它可能会变得无效,从而导致未定义的行为。w
parent
如果你想要一个与Qt的父子所有权接口的指针类型,请使用QPointer
评论
1赞
Aykhan Hagverdili
1/16/2023
#2
在此示例中,所有权由 new-site 和 共享,因为拥有 -ed 对象的代码可以 ,而 的析构函数将自身从子列表中取出。但是,如果未在新站点上删除,则将在其析构函数中删除它。
parent
new
delete
w
W
parent
w
parent
这是错误的。创建此对象的代码不应删除它,除非它绝对确定父对象仍处于活动状态,否则将收到双重释放错误(因为父对象已经释放了该对象)。
正确的解决方案是按照另一个答案中的说明使用。QPointer
评论
0赞
Johannes Schaub - litb
1/16/2023
事实上,我应该更清楚地了解这些关系。我省略了当父级删除子级时,或者当新站点删除指针时,无论指针仍在使用中(父级)还是指针已被删除(当新站点删除它时),根本没有类型检查。感谢您的澄清!后续问题:我怎样才能教静态分析仪关于QPointer的知识?还是他们已经明白了? 来自Qt,我无法修补它以使用QPointer,不幸的是:(QWidget(QWidget *parent)
0赞
Johannes Schaub - litb
1/16/2023
例如,如果我的代码说静态分析器可以抱怨我有一个弱所有者,但没有一个强所有者,因为他们没有看到传递给 QWidget 构造函数的父指针充当潜在的删除者QPointer<QWidget> p(new QWidget(parent))
0赞
Aykhan Hagverdili
1/16/2023
@JohannesSchaub升 您是否有任何特定情况,当您这样做时,您会收到有关所有权的警告?QPointer<QWidget> p(new QWidget(parent))
评论
gsl::owner