Comment mettre à jour les autres pointeurs lorsque realloc déplace le bloc de mémoire?
Question
La référence realloc dit:
La fonction peut se déplacer le bloc de mémoire à un nouvel emplacement, auquel cas la nouvel emplacement est retourné.
Est-ce que cela veut dire que si je fais ceci:
void foo() {
void* ptr = malloc( 1024 );
unsigned char* cptr = ( unsigned char* )ptr+256;
ptr = realloc( ptr, 4096 );
}
alors DPCOL peut devenir invalide si realloc déplace le bloc?
Si oui, alors le signal de realloc de quelque façon que ce sera déplacer le bloc, afin que je puisse faire quelque chose pour empêcher DPCOL de devenir invalide?
La solution
Oui, cptr
deviendra invalide realloc déplace le bloc! Et non, il n'y a aucune mention de vous signaler à dire qu'il se déplace le bloc de mémoire. Soit dit en passant, votre code semble hasardeux ... lire la suite ... s'il vous plaît voir mon Réponse à une autre question et lire le code très soigneusement sur la façon dont il utilise realloc
. Le consensus général est que si vous faites ceci:
void *ptr = malloc(1024); /* later on in the code */ ptr = realloc(ptr, 4096); /* BAM! if realloc failed, your precious memory is stuffed! */
La façon de se déplacer est d'utiliser un pointeur temporaire et l'utiliser comme indiqué:
void *ptr = malloc(1024); /* later on in the code */ void *tmp = realloc(ptr, 4096); if (tmp != null) ptr = tmp;
Modifier. Merci sécurisé pointant vers un gremlin qui se sont glissées quand je tapais plus tôt sur
Autres conseils
Oui, cptr
deviendra invalide si realloc déplace le bloc.
Non, il n'y a pas de signal. Vous devez vérifier la valeur de retour contre l'emplacement de ptr
d'origine.
Cela vient un peu tard, mais la solution à ce problème (que personne n'a mentionné) est de ne pas utiliser des pointeurs en blocs attribués qui devront être alloués. , Utiliser à la place des décalages à valeurs entières à partir du pointeur de base ou (mieux) utiliser un des éléments de type struct
et membres à adresser des emplacements spécifiques dans l'objet alloué.
Oui.
La meilleure chose à faire est de comparer ptr avant et après la réaffectation, et voir si elle a été déplacée. Vous ne devriez pas attribuer un pointeur sur la valeur de décalage, au lieu que vous devez stocker le décalage et l'index de l'opérateur d'origine avec.
i.e..
Au lieu de
void* newPtr = ptr + 10;
*newPtr = something;
Utilisation
int new = 10;
ptr[new] = something;
Oui, le DPCOL devient invalide si realloc déplace le bloc.