2017-04-05 5 views
0

Dans la documentation Qt, il est un exemple, où ils utilisentQList de Qvectors clair

foreach (QVector<QPointF> row, m_data) 
    row.clear(); 
m_data.clear(); 

pour effacer <QList<QVector<QPointF> > m_data;

Est-il nécessaire d'utiliser une telle construction ou tout simplement m_data.clear(); est enoungh?

Exemple Qt.

Répondre

0

Non seulement c'est inutile, mais il peut être "nocif".

Il est inutile car QList<T>::clear() détruira chaque T qu'il possède effectivement en appelant ~T(). Dans votre cas, cela signifie que vous finissez par appeler ~QVector<QPointF>() pour chaque vecteur dans la liste QList. Et puis ~QVector<QPointF>() appellera ~QPointF() pour chaque point.

Les performances peuvent être dangereuses car QList et QVector utilisent Copy-on-Write. Cela signifie que lorsque vous copiez une liste, vous ne copiez pas les données internes, mais une copie se produira dès que vous effectuerez une action qui modifiera l'une des listes. Par conséquent, si m_data partage ses données internes avec une autre liste QList, la modification de l'un de ses éléments (par exemple en appelant l'QVector::clear() sur l'un d'entre eux) déclenchera une copie papier des données internes QList. Et cette copie est complètement inutile car vous l'écartez juste après en appelant le m_data.clear().


également intéressant de noter que:

foreach (QVector<QPointF> row, m_data) 
    row.clear(); 

ne change pas m_data. Vous effacez row qui est une variable locale. Et même si vous en vous écrivant:

foreach (QVector<QPointF> &row, m_data) 
     row.clear(); 

Il n'a aucun effet, citant doc Qt:

Depuis foreach crée une copie du récipient, en utilisant une référence non-const pour la variable ne vous permet pas de modifier le conteneur d'origine. Cela n'affecte que la copie, ce qui n'est probablement pas ce que vous voulez .