[Development] parented_ptr
André Somers
andre at familiesomers.nl
Thu Oct 16 16:30:30 CEST 2025
On 16-10-2025 13:46, Daniel Schürmann wrote:
> Hi André
>
> Nice that you can confirm that there is a demand from others for a
> solution.
You're not the only one using that warning in their CI, it seems... :-)
>
> > Perhaps it might be easier or better to add a make_child template method
> to QObject that returns a new instance of the template type, parented to
> the object you call it on?
>
> That's actually the solution I was looking for.
> I love that idea. Thank you.
>
> What type is the returned pointer? I like to have one that has the
> semantical guarantee of being a child object. This is beneficial to
> distinguish classic owned pointer member variables from borrowed from
> the Qt Object tree.
>
> Do you have an idea?
Well, my suggestion would be to not introduce a separate non-owning
pointer type at all, so it would just return the type itself, just like
new does. As was already pointed out, a raw pointer should already be
understood as a non-owning pointer. I personally don't see the worth of
introducing a special pointer type for instances that were created with
a QObject-parent. I think it will just cause a lot of confusion and
headaches for integrating that properly and consistently into Qt, not to
mention getting it adopted in legacy code bases. I think having CI check
for naked new() calls in your project, as you already do, would be
enough, and _that_ doesn't need a new pointer type.
>
> While the code is kind of trivial, the main benefit it the
> semantically effect that you are able to annotate a pointer as
> patented in a standardized syntax across code base. You don't have to
> learn custom solution and a upstream provided version will help to
> make this approach a recommendation standard style.
>
> > I don't quite see how you expect this to find a place in the current API
>
> The moc generated code may use it for instance.
How? Could you give an example, and explain how it would do something
new we can actually use?
>
> Getter that return an patented object pointer to another object are
> borrowed pointers and doing it via a raw pointer is just in the sense
> of the C++ Core Guidelines.
The pointer you get back from a `->makeChild(...)` would also be
"borrowed" in this sense: somebody else is taking responsibility for
cleanup later on. The only difference is, that deleting it is generally*
safe, as the owner won't try to delete it again.
> We need to consider the case where this pointer will be stored,
> creating a shared ownership. For this case the QPointer is designed,
> but it does not have the "patented" semantic. Maybe we need another
> pointer for that?
(Assuming you mean "parented", not "patented" above.) It doesn't strike
me as a good idea to do that. I think it will be quite confusing. The
way you describe it already creates confusion to me, as "shared
ownership" in C++ refers to the idea that the last one still having a
pointer to the payload deletes it on destruction, but that's basically
the opposite of what happens here, if I understand you correctly.
If you need to monitor if a QObject is still alive, you can already do
that with QPointer. No need for a new type there.
Cheers,
André
More information about the Development
mailing list