ostream如何管理内存?

时间:2014-09-14 14:58:00

标签: c++ ios ostream

与在堆上分配内存的std::stringstd::ofstream相比,包含std::cout的程序似乎没有任何堆分配。我知道std::ostream继承了xalloc,iwordpword。后两者描述了他们确实有某种内存管理。

  

首先,分配或调整私有存储(动态数组长)   或另一个可索引的数据结构)足以使索引a   有效索引,然后返回对long元素的引用   带索引索引的私有存储。

但是valgrind似乎表明没有任何堆分配。

  1. 何时进行此分配/调整大小?
  2. std::ostream内部使用new和delete或malloc并免费使用吗?

1 个答案:

答案 0 :(得分:2)

std::ostream是一个基类,它允许派生类挂钩到它的std::streambuf。 因此,std::ostream可以被视为std::streambuf指针的包装器(以及指向它的区域设置和格式信息的指针)。

std::streambuf本身就是一个基类,它有一堆虚函数,它们本身并不分配内存 - 派生类在实现它时会这样做。例如std::filebuf实现std::fstream的流缓冲区,为文件I / O分配缓冲区。

据我所知,缓冲I / O(使用iostream与否)在堆上为其缓冲区分配内存,包括std::cout。标准输出流的缓冲区很早就分配(在main之前)并且在所有情况下都是如此。因此,当您执行或不使用std::cout时,您的程序将不会使用更多或更少的内存。至少在使用libstdc ++ 6的GNU / Linux上。其他实现可能使用以不同方式分配的特殊缓冲区。