For example, can it be used in Qt for the following?
gsl::owner<QWidget*> w{new QWidget{parent}}
In this example, the ownership is shared by the new-site and the parent
, because the code who has new
-ed the object can delete
w
, and W
's destructor will take itself out of parent
children list. However, if w
is not deleted at the new-site, then parent
will delete it in its destructor.
- Is this an example of shared ownership, and
- can
gsl::owner
be used for it?
CodePudding user response:
Is this an example of shared ownership
No, you have two places claiming unique ownership.
can
gsl::owner
be used for it
If w
can outlive the object pointed to by parent
, then it might become invalid, leading to undefined behaviour.
If you want a pointer type that interfaces with Qt's parent-child ownership, use QPointer
CodePudding user response:
In this example, the ownership is shared by the new-site and the
parent
, because the code who hasnew
-ed the object candelete
w
, andW
's destructor will take itself out ofparent
children list. However, ifw
is not deleted at the new-site, thenparent
will delete it in its destructor.
This is wrong. The code that has created this object should not delete it unless it is absolutely sure that the parent is still alive, otherwise you will get double-free errors (because parent would have freed the object already).
The correct solution is to use QPointer
as mentioned in the other answer.