Salut,
Un shared ptr est un pointeur dont la durée de vie est partagée entre différents objets.
Un weak ptr est utilisé lorsqu'on ne veut pas interférer avec la durée de vie du pointeur mais juste pouvoir l'utiliser au besoin (et s'il existe).
Les responsabilités sont différentes : dans un cas, la gestion de la ressource est partagée (shared ptr), dans l'autre non (celui qui a un weak ptr ne gère pas la ressource et peut donc la perdre). Choisir l'un ou l'autre dépend donc de ce critère : partage de sa gestion ou non.
Et il y a les scopped ptr dont la responsabilité est attribuée une fois et n'est pas partagée.
Cf le tuto de Loïc Joly sur
les pointeurs intelligents.
Dans ton cas, outre que les cycles peuvent relever d'un problème de design, ça ressemble à une composition entre Main et Module. La durée de vie de
m est identique à celle de l'objet
Main qui le possède. J'ai l'impression que
Module devrait avoir non pas un pointeur mais une référence vers
Main, référence initialisée à la construction :
1 2 3 4 5 6 7 8 9 10
| class Main
{
Module m;
}
class Module
{
Module(Main &parent_):parent(parent_){}
Main& parent; //shared_ptr plutot ?
} |
La référence traduit cette dépendance de façon encore plus forte que le pointeur (quelque soit son intelligence).
Partager