标准库设施,分配但不使用分配器

Tri*_*dle 10 c++ memory-management allocator c++-standard-library

在C++标准库分配内存的大多数地方,用户可以通过提供满足Allocator要求的类来自定义它.例如,几乎所有容器都接受一个allocator模板参数,并std::allocate_shared返回一个shared_ptr包含的元素和控制块都通过提供的Allocator分配.

但是,标准库可以(可能)分配内存的地方有一些,但是没有Allocator提供支持.我能想到的是:

  • std::make_unique()(没有相应的allocate_unique())
  • std::any
  • std::function (分配器支持将在C++ 17中删除)
  • std::valarray
  • std::basic_filebuf(虽然std::basic_stringbuf 使用分配器)
  • std::inplace_merge()

问题:

  • 我确定这个清单不完整,但我还错过了什么?
  • 在非Allocator类和函数中,它们是指定使用global ::operator new,plain new还是未指定的内存源?
  • 如果有人知道,没有提供分配器支持any并将其从中删除的原因是function什么?

T.C*_*.C. 6

不是一个详尽的清单.

  • 一切都在<stdexcept>,需要分配内存来存储消息字符串.
  • 标准池/单调内存资源类显然分配内存,但它们是从另一个内存资源而不是分配器执行的,因此它们在技术上适合您的描述.
  • boyer_moore_searcherboyer_moore_horspool_searcher.
  • 几个<algorithm>算法试图以获得附加的存储器(例如,stable_partition,stable_sort)和所有的并行算法(不管头的)可能需要额外的存储器.
  • 文件系统库中有很多东西:
    • path; 那个曾经在内部使用默认的分配器,但看起来最新的草案删除了这个要求,虽然它似乎仍然是意图.
    • directory_iteratorrecursive_directory_iterator.
    • 一些可以构造临时paths的文件系统操作.
  • basic_­regex.
  • threadasync.
  • packaged_task,在C++中删除了分配器支持17.
  • promise 将需要某个地方来放置共享状态.
  • 输入输出流.
  • 许多东西被硬编码为使用默认分配器:
    • error_code::message(),error_condition::message(),error_category::message():这些返回string,所以只能默认分配器.
    • bitset流插入运算符在逻辑上to_string使用默认分配器调用,但实际上没有高质量的实现可以实现.
    • to_stringto_wstring免费函数返回std::string/ std::wstring分别; 没有机会指定自己的分配器.显然,用户定义的文字string(例如"foo"s)也没有自定义分配器支持.
    • 有几个方面<locale>使成员函数返回std::string或者std::basic_string<charT>,即使用默认分配器(例如numpunct),或仅接受basic_string<charT>(例如money_get).
    • 各种类型<random>使用vector默认分配器.

如果有人知道,没有提供分配器支持any并将其从中删除的原因是function什么?

any分配器的支持是无法实现的.function分配器支持的指定很差,并且存在问题.

  • 我的天啊,多么令人惊奇的答案啊。我想我可能错过了两三个项目,我不知道清单这么长!非常感谢您不辞辛劳地编译它。 (2认同)