OVH Cloud OVH Cloud

vector et durée de vie des pointeurs

3 réponses
Avatar
JM
Supposons que j'ai une classe :

class Gestion
{
vector<Config> Tab

Config *GetConfig(critère)
}

Je fais diverses insertions, intialisations...

Dans diverses parties de mon code, j'utilise GetConfig et récupère ainsi
l'adresse d'un élément de Tab, vérifiant mon critère, et que je stocke
dans Config *pBidule;

Le problème, c'est que pendant ce temps, Tab peut être redimensionné et
mon pointeur pBidule devient invalide.

A part le récupérer à nouveau, est-ce qu'il y a d'autres possibilités?

J'ai pensé à remplacer mon tableau par vector<Config *> Tab, n'ayant
ainsi plus le problème évoqué, vu que j'ai les pointeurs sur les Config
crées à l'aide de new.
Mais cela ne me convient pas trop, cela me semble assez lourd en fait.

Merci

3 réponses

Avatar
Falk Tannhäuser
JM schrieb:
class Gestion
{
vector<Config> Tab
Config *GetConfig(critère)
}

Je fais diverses insertions, intialisations...

Dans diverses parties de mon code, j'utilise GetConfig et récupère ainsi
l'adresse d'un élément de Tab, vérifiant mon critère, et que je stocke
dans Config *pBidule;

Le problème, c'est que pendant ce temps, Tab peut être redimensionné et
mon pointeur pBidule devient invalide.

A part le récupérer à nouveau, est-ce qu'il y a d'autres possibilités?


Utilise std::list à la place de std::vector - les pointeurs et
itérateurs restent alors valides si on insère ou supprime des éléments
(sauf s'il pointent sur l'élément supprimé, bien sûr).

Autre solution : Si tu veux garder std::vector, stocke l'indice de
l'élément en question plutôt qu'un pointeur - il restera valide en cas
de rédimensionnement (à moins que tu insères ou supprimes quelque chose
avant, ce qui décale le reste).

Falk

Avatar
JM

Utilise std::list à la place de std::vector - les pointeurs et
itérateurs restent alors valides si on insère ou supprime des éléments
(sauf s'il pointent sur l'élément supprimé, bien sûr).


J'avais un doute, merci

Autre solution : Si tu veux garder std::vector, stocke l'indice de
l'élément en question plutôt qu'un pointeur - il restera valide en cas
de rédimensionnement (à moins que tu insères ou supprimes quelque chose
avant, ce qui décale le reste).



Oui, c'est pour cela que finalement j'ai abandonné mon tableau

Avatar
loufoque
Supposons que j'ai une classe :

class Gestion
{
vector<Config> Tab

Config *GetConfig(critère)
}


Pourquoi ne pas retourner une référence plutôt ?