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.
Ç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.
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.