Le problème est, que j'ai un QVector
de QSharedPointer
et je veux mettre une partie d'entre eux à mon QCache
. Comment puis-je insérer un pointeur partagé à QCache
? Que se passe-t-il si je place le pointeur sur mon cache mais détruis le QVector
et le pointeur partagé? La mémoire sera-t-elle libérée et mon cache ne pointera nulle part?QCache et QSharedPointer
Répondre
C'est un bug si vous mettez juste un pointeur sur votre article à QChache
et en même temps ce pointeur est géré par QSharedPointer
. L'objet item peut être détruit par QSharedPointer
destructor, donc QChache
aura un pointeur invalide. C'est un problème générique que vous ne pouvez pas avoir différents propriétaires d'un pointeur qui ne se connaissent pas. Si vous gérez des pointeurs par QSharedPointer<Item>
alors QChache
ne devrait pas travailler directement avec Item
il devrait fonctionner uniquement avec QSharedPointer<Item>
, par exemple:
// wrong
QCache<int, Item> cache;
QVector<QSharedPointer<Item> > vec;
Item *item = new Item;
vec.push_back(QSharedPointer<Item>(item));
cache.insert(1, item);
// or
cache.insert(1, vec.at(0).data());
// also wrong
QCache<int, <QSharedPointer<Item> > cache;
vec.push_back(QSharedPointer<Item>(item));
cache.insert(1, new QSharedPointer<Item>(item));
// here two different instances of QSharedPointer are initialized
// by the same pointer 'item'
// correct
QCache<int, <QSharedPointer<Item> > cache;
cache.insert(1, new QSharedPointer<Item>(vec.at(0)));
Ainsi, QCache
devrait avoir sa propre copie allouée dynamiquement QSharedPointer
objet et cet objet QSharedPointer
devrait être correctement initialisé par d'autres QSharedPointer
qui a déjà la propriété de l'instance Item
.
Merci, je vais essayer ça. Mais dans un autre thread quelqu'un m'a dit de ne pas utiliser de pointeurs intelligents avec QCache. Voir ici: http://stackoverflow.com/a/33158035/5447060 – adapto
@adapto C'est parce que vous n'avez pas mentionné dans votre question que le même objet sera utilisé en dehors de 'QCache'. C'est correct si vous allouer un nouvel objet et ensuite le passer à 'QCache', mais dans ce cas, ce pointeur ne devrait pas appartenir à un autre objet. –
Merci Orest. Maintenant c'est clair. – adapto
Les pointeurs partagés utilisent le comptage des références, donc rien ne sera supprimé par QSharedPointer tant que le dernier QSharedPointer pointant dessus n'est pas détruit. – sashoalm