Comment mettre à jour les autres pointeurs lorsque realloc déplace le bloc de mémoire?

StackOverflow https://stackoverflow.com/questions/2172127

  •  24-09-2019
  •  | 
  •  

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top