2015-10-22 4 views
3

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

+1

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

Répondre

3

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.

+0

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

+1

@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. –

+0

Merci Orest. Maintenant c'est clair. – adapto