gsl::owner 是否可用于共享所有权?

Is gsl::owner usable for shared-ownership?

提问人:Johannes Schaub - litb 提问时间:1/16/2023 更新时间:1/16/2023 访问量:91

问:

例如,它可以在Qt中用于以下用途吗?

gsl::owner<QWidget*> w{new QWidget{parent}}

在此示例中,所有权由 new-site 和 共享,因为拥有 -ed 对象的代码可以 ,而 的析构函数将自身从子列表中取出。但是,如果未在新站点上删除,则将在其析构函数中删除它。parentnewdeletewWparentwparent

  1. 这是共享所有权的一个例子吗,以及
  2. 可以用于吗?gsl::owner
C++ cpp-core-guidelines 指南-支持库

评论

0赞 Homer512 1/16/2023
如果您忘记删除,创建警告不是重点吗?那么,您是要明确删除还是希望父母处理它?在我看来,删除具有父级的对象更像是从集合中删除元素,父级是其子级的集合。gsl::owner
1赞 Johannes Schaub - litb 1/16/2023
@Homer512我不知道。不要被我的代表混淆,我完全无知!

答:

2赞 Caleth 1/16/2023 #1

这是共享所有权的一个例子吗

不,您有两个地方声称拥有独特的所有权。

可用于它gsl::owner

如果 可以比 所指向的对象存活,则它可能会变得无效,从而导致未定义的行为。wparent

如果你想要一个与Qt的父子所有权接口的指针类型,请使用QPointer

评论

0赞 Johannes Schaub - litb 1/16/2023
谢谢你的回答!stroustrup.com/resource-model.pdf 似乎同意使用 来指定唯一所有权。owner
1赞 Aykhan Hagverdili 1/16/2023 #2

在此示例中,所有权由 new-site 和 共享,因为拥有 -ed 对象的代码可以 ,而 的析构函数将自身从子列表中取出。但是,如果未在新站点上删除,则将在其析构函数中删除它。parentnewdeletewWparentwparent

这是错误的。创建此对象的代码不应删除它,除非它绝对确定父对象仍处于活动状态,否则将收到双重释放错误(因为父对象已经释放了该对象)。

正确的解决方案是按照另一个答案中的说明使用。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))