2014-09-14 1 views
0

Par rapport à std::string et std::ofstream qui n'allouer de la mémoire sur le tas, les programmes contenant std::cout ne semblent pas avoir une allocation de tas. Je sais que std::ostream s hériteront xalloc, iword et pword. Les deux derniers ont des descriptions qu'ils ont une sorte de gestion de la mémoire.COMMEnT ostream gérer la mémoire?

Premièrement, alloue ou redimensionne le stockage privé (tableau dynamique de longue ou d'une autre structure de données indexable) suffisamment pour indexer un index valide, puis renvoie une référence à long élément de stockage privé avec le index d'index.

Mais valgrind semble indiquer qu'il n'y a pas d'allocation de tas.

  1. Quand cette allocation/redimensionnement se produit-elle?
  2. Est-ce nouveau et supprimer ou malloc et libre usage interne du std::ostream?
+0

Je suppose que 'std :: ostream' laisse son 'std :: streambuf' interne faire la gestion de la mémoire pour le tampon. – Galik

Répondre

1

Un std::ostream est une classe de base qui permet aux classes dérivées de se connecter à un std::streambuf. Ainsi, un std::ostream peut être vu comme un wrapper autour d'un pointeur std::streambuf (avec un pointeur vers son locale et ses informations de formatage). Le std::streambuf est en soi une classe de base avec un tas de fonctions virtuelles qui n'allouent pas en soi les classes dérivées de la mémoire quand elles l'implémentent. Par exemple std::filebuf qui met en oeuvre le tampon de flux d'un std::fstream, alloue le tampon pour le fichier E/S. Pour autant que je sache, les E/S tamponnées (utilisant iostream ou non) allouent de la mémoire sur le tas pour son tampon, y compris std::cout. Le buffer du flux de sortie standard est alloué très tôt (avant main) et dans tous les cas. Ainsi, votre programme n'utilisera pas plus ou moins de mémoire lorsque vous utilisez ou n'utilisez pas std::cout. Au moins sur GNU/Linux en utilisant libstdC++ 6. Il est possible que d'autres implémentations utilisent des tampons spéciaux qui sont attribués d'une manière différente.

Questions connexes