Supposons que j'ai un vecteur d'INTS,
int *oneNumber = &numbers[43];
7 Réponses :
Non - le vecteur peut être réaffecté quand il s'agit. Habituellement, une fois le vecteur double de la taille.
de la norme C ++ 11 p>
est une -enumber garanti de toujours pointer sur l'INT à l'index 43 p> blockQuote>
Oui, ceci est garanti par la norme. P>
Même si disons que je redimensionnez des chiffres à quelque chose comme des chiffres.Resize (46)? P> blockQuote>
non. Une fois que vous avez redimensionné, ajoutez ou supprimez quoi que ce soit au vecteur, toutes les adresses et les itérateurs sont invalidés. En effet, le vecteur peut avoir besoin d'être réaffecté avec de nouveaux emplacements de mémoire. P>
Qu'en est-il de si vous utilisez un std :: liste code>? Est-ce que cela contournera le problème d'adresse non valide si vous utilisez uniquement
list.push_back () code> appels pour ajouter des éléments? (Et vous ne retirez pas l'élément que
surNumber code> pointe sur?
@bobobobo c'est une bonne question. Je ne suis pas sûr de ce que la norme en dit de la norme, mais je ne vois aucune raison d'ajouter / supprimer un std :: list code> invaliderait tous les pointeurs. (Sauf l'élément qui est supprimé) Nous en discutons dans le salon en ce moment si vous voulez vous joindre. a>
Trouvé une autre solution de contournement que j'utilise actuellement.
Votre paranoïa est correcte. Redimensionner un std :: vecteur code> peut entraîner une modification de son emplacement de mémoire. Cela signifie que votre
surNumber code> pointe maintenant vers un ancien emplacement de mémoire qui a été libéré, et il est donc nécessaire d'y accéder à un comportement indéfini. P>
Lorsque vous utilisez une fonction de redimensionnement () ou de réserve de vecteur () pour augmenter la capacité du vecteur, il peut être nécessaire de réaffecter la mémoire pour le support de réseau. Si cela réaffecte, la nouvelle mémoire ne sera pas située à la même adresse. L'adresse stockée dans Onenumber ne pointera plus au bon endroit. P>
Encore une fois, cela dépend du nombre d'éléments que le vecteur est actuellement utilisé pour stocker et la taille demandée. Selon les spécificités, le vecteur peut être capable de redimensionner sans réaffecter, mais vous ne devriez certainement pas supposer que ce sera le cas. P>
Pointeurs, références et itérateurs à Si vous souhaitez que vos objets restent restent et que vous insérez uniquement de nouveaux éléments à la fin ou au début, vous pouvez utiliser STD :: Vecteur Code> Les éléments sont garantis pour rester aussi longtemps que vous n'appuyez que sur le
std :: vecteur code>
std :: vecteur code> ne se développe pas au-delà de sa capacité
() code> au moment où le pointeur, la référence ou l'itérateur a été obtenu. Une fois qu'il est redimensionné au-delà de la capacité
() code> Tous les pointeurs, références et itérateurs à ce
std :: vecteur code> invalident. Notez que les choses sont également invalidées lorsque vous insérez quelque part ailleurs que la fin du
std :: vecteur code>. P>
std :: deque code>. Pointeurs et références aux éléments du
STD :: DEQUE CODE> Obtenez uniquement invalidé lorsque vous insérez au milieu du
std :: deque code> ou lorsque vous retirez du milieu ou lorsque vous enlevez le objet référencé. Notez que les itérateurs aux éléments du
std :: deque code> sont invalidés chaque fois que vous insérez un élément dans le
std :: deque code> ou retirez tout élément de celui-ci. P>
Une fois que vous avez changé la capacité du vecteur, les données ont été copiées sur un autre bloc de mémoire et les données d'origine sont supprimées. P>
Comme tous les autres ont dit, lorsque vous appelez Une solution de contournement pour cela est Donc, dans votre exemple, P> .Resize () code> sur un vecteur, vos pointeurs deviennent invalidés car le (ancien tableau) peut être complètement traité, et un tout de nouveau neuf peut être redevable -Aluté et vos données copiées dans elle.
std::vector<int> numbers;
int *oneNumber = &numbers[43]; // no. pointers invalidated after .resize or possibly .push_back.
int oneNumberIndex = 43 ; // yes. indices remain valid through .resize/.push_back
Pour cette raison, je me méfie toujours de créer un vecteur de types de valeur, car j'ai inévitablement besoin d'un pointeur sur les objets à l'intérieur du vecteur. Donc, je sauvegarder une référence comme
int * ref = & Numbers [43] code> .. plus tard faire quelques
push_back code> s dans
numéros code> et whambo! BOGUE:
ref code> n'est pas valide, car
numéros code> a été complètement réaffecté et enregistré dans un espace mémoire complètement différent.
@bobobobo très vrai. Bien que pour des situations où le nombre d'éléments est connu au moment de la création (et non, je ne peux pas utiliser
std :: gray code>, car je
emplace code> -construct les valeurs en boucle ),
réserve code> garantit que tous les pointeurs / itérateurs dans le vecteur resteront valables, tant qu'il n'est pas redimensionné au-delà de sa capacité actuelle (ce qui pourrait forcer une réaffectation et déplacer donc les adresses des valeurs contenues) . Cela m'a sauvé quelques fois, mais chaque temps successif, j'oublie de
réserve code> et de gratter ma tête pendant un certain temps jusqu'à ce que je me souvienne. :RÉ