An den meisten Stellen, an denen die C ++ - Standardbibliothek Speicher zuweist, kann der Benutzer dies anpassen, indem er eine Klasse bereitstellt, die Allocator
Anforderungen . Zum Beispiel nehmen fast alle Container ein Allokator-Template-Argument an, und std::allocate_shared
gibt eine shared_ptr
zurück, deren enthaltenes Element und Steuerblock beide über einen bereitgestellten Allocator zugewiesen sind.
Es gibt jedoch einige Stellen, an denen die Standardbibliothek (möglicherweise) Speicher reservieren kann, aber keine Allocator
support. Die, die ich mir vorstellen kann, sind:
std::make_unique()
(keine entsprechende allocate_unique()
) std::any
std::function
(Zuweiserunterstützung wird in C ++ 17) std::valarray
std::basic_filebuf
(obwohl std::basic_stringbuf
einen Zuweiser verwendet) std::inplace_merge()
Fragen:
::operator new
, plain new
oder die Speicherquelle nicht spezifiziert verwenden? any
nicht erfolgt und sie aus function
? Nicht unbedingt eine erschöpfende Liste.
<stdexcept>
, das Speicher zum Speichern der Nachrichtenzeichenfolge reservieren muss. boyer_moore_searcher
und boyer_moore_horspool_searcher
. <algorithm>
-Algorithmen versuchen, zusätzlichen Speicher zu erhalten (z. B. stable_partition
, stable_sort
), und alle parallelen Algorithmen (unabhängig vom Header) benötigen möglicherweise zusätzlichen Speicher. path
und directory_iterator
. recursive_directory_iterator
. basic_regex
und thread
. async
, Zuweisungsunterstützung wurde in C ++ 17 entfernt.
Viele Dinge sind hart codiert, um den Standardzuordner zu verwenden:
packaged_task
, error_code::message()
, error_condition::message()
: Diese geben ein error_category::message()
zurück, also nur den Standard-Allokator. string
ruft fiktiv bitset
mit dem Standardzuordner auf, obwohl dies in der Praxis nicht durch eine Implementierung mit hoher Qualität möglich ist. to_string
und to_string
free geben to_wstring
/ std::string
zurück; keine Chance, einen eigenen Allokator anzugeben. Offensichtlich haben die benutzerdefinierten Literale für std::wstring
(z. B. string
) auch keine Unterstützung für benutzerdefinierte Zuordnungen. "foo"s
, deren Memberfunktionen entweder <locale>
oder std::string
zurückgeben, dh den Standardzuordner verwenden (zB std::basic_string<charT>
), oder nur numpunct
akzeptieren (zB basic_string<charT>
). money_get
verwenden <random>
mit dem Standardzuordner. Wenn jemand weiß, was die Gründe dafür sind, dass kein Allokator zur Verfügung steht Unterstützung in
vector
und Entfernen vonany
?
function
's Zuweisungsunterstützung ist nicht implementierbar . any
's Allokator-Unterstützung ist schlecht spezifiziert und mit Problemen geplagt .
Tags und Links c++ memory-management c++-standard-library allocator