web-dev-qa-db-fra.com

Malloc renvoie-t-il une "valeur de pointeur non valide" en C ++ 17?

Selon C++ 17 [basic.compound]/3:

Chaque valeur de type pointeur est l'une des suivantes:

  • un pointeur vers un objet ou une fonction (le pointeur est dit pointer vers l'objet ou la fonction), ou
  • un pointeur au-delà de la fin d'un objet (8.7), ou
  • la valeur du pointeur nul (7.11) pour ce type, ou
  • une valeur de pointeur non valide.

La fonction malloc renvoie une valeur de pointeur. Supposons que l'appel ait réussi, afin que la valeur de retour ne soit pas nulle. La spécification de malloc ([c.malloc]) n'indique pas qu'elle crée des objets dans le stockage renvoyé, il semble donc que "valeur de pointeur non valide" soit la catégorie la moins absurde.

16
Brian

Ça a du sens. Il s'agit d'une "valeur de pointeur non valide" car elle ne pointe pas vers un objet.

Voir plus loin dans cette section, où il est dit:

Une valeur de pointeur devient invalide lorsque le stockage qu'elle désigne atteint la fin de sa durée de stockage

Cela implique que ce n'est pas la "valeur" du pointeur qui le rend invalide, mais plutôt qu'il ne pointe pas vers un objet valide.

8
Marshall Clow

C'est exact.

Il n'y a aucun objet à cet emplacement en mémoire. La mémoire "vous appartient". Cependant, la validité d'un pointeur n'est pas déterminée par les allocations de mémoire, mais par l'existence d'un objet vers lequel il pointe. Ce pointeur ne pointe sur aucun objet, il s'agit donc d'un pointeur non valide.

p0593rX , s'il était adopté à l'avenir, cela changerait cela, essentiellement en y mettant un objet pour vous. C'est en fait assez important, car pour le moment toute utilisation de malloc en C++ à laquelle je peux penser (y compris le placement nouveau) a actuellement un comportement indéfini.