Question

Amis

Dans notre C ++, Iam utilise actuellement la méthode realloc pour redimensionner la mémoire allouée par malloc. L’utilisation de realloc () se fait comme ci-dessous

my_Struct *strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

strPtr = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);

maintenant wikipeadia (_http: //fr.wikipedia.org/wiki/Malloc) dit que

Si au lieu de cela on l'a fait

void *p = malloc(orig_size);

/* and later... */

p = realloc(p, big_size);

alors s'il n'est pas possible d'obtenir des octets de taille importante de la mémoire, p aura la valeur NULL et nous n'avons plus de pointeur sur la mémoire allouée précédemment pour p, ce qui crée une fuite de mémoire

Et il est également indiqué que la bonne façon de corriger l'erreur ci-dessus est

void *p = malloc(orig_size);

/* and later... */

void *tmp = realloc(p, big_size); 

if (tmp != NULL)
 {

p = tmp; /* OK, assign new, larger storage to p */

} 

else 

{

/* handle the problem somehow */

}

Pouvez-vous me dire quel est le meilleur moyen d'utiliser realloc ()

aussi une fois que j'ai pointeur sur une structure et puis tout en utilisant realloc plus tard, puis-je utiliser le pointeur sur un vide ???

Merci beaucoup

Était-ce utile?

La solution

Bien sûr, vous devez vous protéger contre le cas où realloc() renvoie NULL. C’est une allocation de mémoire, et en C (où <=>) est la plupart du temps utilisée, je pense que les programmeurs C ++ pensent que l’utilisation d’appels bruts <=> en première ligne est un peu de bas niveau.

, les allocations de mémoire peuvent toujours échouer.

Le remplacement direct du pointeur par la valeur renvoyée est une erreur car il supprime le pointeur d'origine et provoque la fuite de mémoire en cas d'échec de la réallocation.

Autres conseils

Malloc () et realloc () sont des fonctions C. En réalité, realloc () fait malloc () et free () en fonction des arguments que vous transmettez:

  • Si vous lui passez un pointeur null, realloc fait ce que malloc fait.
  • Si vous lui donnez une taille nulle, realloc fait ce que free fait.

Cité à partir de Here , pour lequel vous avez une explication plus détaillée.

La bibliothèque C rend impossible l'extension d'un bloc de mémoire sur place. C ++ ne le prend donc pas en charge.

Si vous souhaitez vous en tenir aux fonctions C, maintenez le pointeur de votre première allocation de mémoire lorsque vous appelez realloc (). Ensuite, vous vérifiez s’il s’agit de la valeur NULL, sinon vous l’attribuez, comme vous l’avez fait dans votre dernier code.

Mais pour C ++, la meilleure solution consiste à créer votre propre mallocator, la solution std basée sur C malloc (). Vérifiez this ou this .

Utilisez l’approche suggérée & # 8211; Maintenez le pointeur dans la mémoire tampon précédente jusqu'à ce que realloc soit correctement retourné. Une fois que realloc () a été renvoyé avec succès, le bloc précédent a été libéré et tous les pointeurs qui le dirigent sont devenus pendants & # 8211; ajustez-les.

realloc ainsi que malloc ne s’intéressent pas au type de pointeur - vous pouvez utiliser void * ainsi que tout autre *.

Comme d'autres l'ont déjà dit, utilisez simplement realloc comme suggéré.

Mais la " façon C ++ " Pour ce faire, il faut utiliser un std :: vector < > plutôt que de maintenir vous-même des tableaux. De cette façon, la bibliothèque standard C ++ s’occupera des détails de bas niveau de la réallocation (vraisemblablement en utilisant realloc ()).

Lorsque realloc () échoue et renvoie NULL, la mémoire d'origine reste intacte.
Donc, vous devriez l'utiliser comme ceci:

my_Struct* strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

my_Struct* tmp = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);
if (tmp != NULL)
{
    strPtr = tmp;
}
else
{
    /* realloc Failed. Need to do something */
}

Pourquoi utilisez-vous malloc et realloc? Il y a presque toujours une meilleure solution en C ++.

Si vous l'utilisez pour créer des tableaux de longueur variable, std :: vector < > ;, ou probablement l'un des autres modèles de conteneur.

Si vous utilisez plutôt C, peut-être avec un compilateur compatible C ++, la méthode correcte est la deuxième méthode, qui ne perd pas tout un bloc de mémoire en cas d’allocation impossible.

La réponse à votre deuxième question dépend également de votre choix d'utiliser C ou C ++. En C, void * est un type de pointeur de données générique, librement convertible. En C ++, void * doit être explicitement converti. Si vous écrivez réellement C, vous devez utiliser malloc () et friends, qui fonctionnent avec void *. Si vous écrivez vraiment en C ++, vous devez lancer un casting, ce qui le rend encore plus gênant. Dans aucun des deux cas, realloc () ne fonctionne sur les pointeurs à structurer, mais plutôt sur les pointeurs à void.

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