2010-10-25 15 views
8

Je opérateur overloadded nouveau [] comme celui-ciC++ surchargé nouvelle requête []: Quelle taille prend-elle en paramètre?

void * human::operator new[] (unsigned long int count){ 
     cout << " calling new for array with size = " << count << endl ; 
     void * temp = malloc(count) ; 
     return temp ; 
} 

et appeler maintenant

human * h = new human[14] ; 

disent sizeof(human) = 16, mais compter qu'il imprime est de 232 qui est 14 * 16 + sizeof (int *) = 224 +8.

Pourquoi cet espace supplémentaire est-il alloué? Et où tombe-t-il en mémoire? Parce que lorsque j'imprime *h OU h[0] j'obtiens les mêmes résultats, donc ce n'est pas au début du morceau de mémoire. Est-ce correct du tout OU il me manque quelque chose ici?

+1

Bonne question. Pourtant, le nitpicker à l'intérieur de moi a besoin de souligner que vous ne vérifiez pas pour malloc() retournant un pointeur nul. – sharptooth

+0

@sharptooth: ur droite mais c'était intentionnel coz je voulais me concentrer sur une vraie question et ne pas ajouter trop d'ifs :) Idéalement, il faut vérifier la température! = 0 sinon jeter une exception (bad_alloc kinda) –

+0

Les octets supplémentaires sont pour stocker le nombre d'octets alloués. Mais où il stocke dépend de l'implémentation. – bjskishore123

Répondre

6

L'espace supplémentaire alloué est utilisé pour stocker la taille de la matrice pour une utilisation interne (en pratique, de sorte que delete[] sait combien de supprimer).

Il est stocké au début de la plage de mémoire, immédiatement avant &h. Pour voir cela, il suffit de regarder la valeur de temp à l'intérieur de votre operator new[]. La valeur différera de celle de &h.

3

Il est de stocker le nombre d'objets alloués de sorte que lorsque vous appelez delete[] un nombre approprié d'objets sont supprimés. Voir ce FAQ pour plus de détails.