Question

Est-il vrai qu'un pointeur affecté à l'adresse de départ d'un tableau alloué dynamiquement ne dispose pas des informations de la taille du tableau? Nous devons donc utiliser une autre variable pour stocker sa taille pour un traitement ultérieur du tableau par le pointeur.

Mais quand nous libérons le tableau alloué dynamiquement, nous ne précisons pas la taille, au lieu que nous venons « ptr libre » ou « supprimer [] ptr ». Comment pourrait libérer ou supprimer connaître la taille du tableau? Peut-on utiliser le même système pour éviter de stocker la taille du tableau dans une autre variable?

Merci!

Était-ce utile?

La solution

Oui, cela est vrai.

delete connaît la taille du segment de mémoire car new ajoute des informations supplémentaires au morceau (habituellement avant la zone retournée à l'utilisateur), contenant sa taille, ainsi que d'autres informations. Notez que cela est la mise en œuvre très spécifique et ne doit pas être utilisé par votre code.

Pour répondre à votre dernière question: Non - nous ne pouvons pas l'utiliser - c'est un détail de mise en œuvre qui est très plate-forme et dépend du compilateur.


Par exemple, dans l'allocateur de mémoire d'échantillon montré dans K & R2, ce sont les « en-tête » placé devant chaque bloc alloué:

typedef long Align; /* for alignment to long boundary */

union header { /* block header */
  struct {
    union header *ptr; /* next block if on free list */
    unsigned size; /* size of this block */
  } s;

  Align x; /* force alignment of blocks */
};

typedef union header Header;

size est la taille du bloc alloué (qui est ensuite utilisé par free ou delete).

Autres conseils

La chose drôle est que, historiquement, il a été delete [20] arr; comme il est arr = new int[20]. Cependant la pratique a prouvé que les informations sur la taille peut être stockée par le sans douleur allocateur, et puisque la plupart des gens qui l'utilisent ensuite stockés de toute façon, il a été ajouté à la norme.

Ce qui est plus drôle, et peu connu, est le fait que cette « syntaxe de suppression prolongée » est en fait soutenu par quelques compilateurs C ++ (en dépit d'être incorrect, même face à la norme 98 C ++), même si aucun besoin il.

int* arr = new int[20];
delete [20] arr;

Le plus triste, tout cela est cependant qu'il n'y a aucun moyen standard conforme à récupérer cette taille passé pour votre propre usage: - /

Il est vrai que le tableau ne contient pas la taille du tableau, vous devez stocker ces informations pour plus tard. Lors de la suppression d'un tableau par delete ou free il est le pointeur vers la mémoire allouée vous passez. Le gestionnaire de mémoire utilisé (soit par le système ou de surcharger votre nouvelle coutume et supprimer) connaît la zone de mémoire qui est libéré, et garde une trace de celui-ci. Espérons que cela fait sens.

Oui, il est vrai. Cela fait partie des raisons pour lesquelles vous devriez essayer rarement de traiter directement, et utiliser un conteneur standard à la place. A propos de la seule fois où il est logique de traiter avec elle est si vous décidez de mettre en œuvre un conteneur vous (dans ce cas, vous suivre normalement les informations de taille dans la mise en œuvre de votre conteneur).

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