Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ostream如何管理内存?_C++_Ios_Ostream - Fatal编程技术网

C++ ostream如何管理内存?

C++ ostream如何管理内存?,c++,ios,ostream,C++,Ios,Ostream,与在堆上分配内存的std::string和std::ofstream相比,包含std::cout的程序似乎没有任何堆分配。我知道std::ostreams继承了xalloc,并且。后两种方法的描述是,它们确实具有某种内存管理 首先,分配或调整私有存储(长数据的动态数组)的大小 或另一个可索引的数据结构)足以使索引成为 有效索引,然后返回对 具有索引的专用存储 但是valgrind似乎表明没有任何堆分配 何时进行此分配/调整大小 std::ostreams内部是否使用new and delete或

与在堆上分配内存的
std::string
std::ofstream
相比,包含
std::cout
的程序似乎没有任何堆分配。我知道
std::ostream
s继承了xalloc,并且。后两种方法的描述是,它们确实具有某种内存管理

首先,分配或调整私有存储(长数据的动态数组)的大小 或另一个可索引的数据结构)足以使索引成为 有效索引,然后返回对 具有索引的专用存储

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

  • 何时进行此分配/调整大小
  • std::ostream
    s内部是否使用new and delete或malloc and free

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

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


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

    我假设
    std::ostream
    让其内部
    std::streambuf
    对缓冲区进行实际内存管理。