Pointeurs intelligents pour les enfants
Le pointeur intelligent classes std::unique_ptr
et std::shared_ptr
sont pour la gestion de la mémoire. Avoir un tel pointeur intelligent signifie, que vous propre le pointeur. Cependant, lors de la création d'un QObject
ou un type dérivé avec un QObject
parent, la propriété (de la responsabilité de nettoyer) est remis à la société mère QObject
. Dans ce cas, la bibliothèque standard de pointeurs intelligents sont inutiles, voire dangereux, car ils peuvent potentiellement causer une double délétion. Oups!
Raw des pointeurs vers des orphelins
Toutefois, lorsqu'un QObject
(ou de type dérivé) est créé sur le tas, sans un parent QObject
, les choses sont très différentes. Dans ce cas, vous ne devriez pas simplement tenir un pointeur brut, mais un pointeur intelligent, de préférence un std::unique_ptr
à l'objet. De cette façon, vous gagnez des ressources de la sécurité. Si plus tard vous avez la main de l'appartenance de l'objet à un parent QObject
vous pouvez utiliser std::unique_ptr<T>::release()
, comme suit:
auto obj = std::make_unique<MyObject>();
// ... do some stuff that might throw ...
QObject parentObject;
obj->setParent( &parentObject );
obj.release();
Si les choses que vous faites avant de donner à votre orphelin d'un parent déclenche une exception, alors vous avez une fuite de mémoire, si vous avez utilisé pointeur brut de tenir l'objet. Mais le code ci-dessus est de sauvegarder l'encontre d'une telle fuite.
Sur un plan plus général
Il n'est pas C++ moderne des conseils pour éviter les pointeurs tous ensemble, mais pour éviter de posséder raw pointeurs. Je pourrais en ajouter un autre, C++ moderne des conseils: Ne pas utiliser des pointeurs intelligents pour les objets qui sont détenus par une autre entité de programme.