22 votes

Est-il garanti que les conteneurs de la bibliothèque standard C++ appellent les nouvelles fonctions remplaçables ?

Si je remplace tous les operator new signatures que je peux, du moins sur les implémentations que j'ai testées, je vois que les conteneurs standards font appel à mes versions remplacées pour allouer de la mémoire.

Est-ce garanti par la norme ? Autrement dit, serait-il illégal pour une implémentation d'utiliser une version optimisée qui n'appelle pas mes fonctions de remplacement pour la mémoire sous-jacente aux conteneurs standard ?

27voto

Brian Points 15388

L'allocateur par défaut pour les conteneurs sensibles à l'allocateur tels que std::vector<T> es std::allocator<T> . Ce modèle de classe est décrit dans la section [default.allocator] de la norme. Selon la section [allocator.members]/6 du C++14 :

le stockage est obtenu en appelant ::operator new(std::size_t)

Donc l'opérateur global nouveau est celui que vous devez remplacer. Si vous avez surchargé operator new spécifiquement pour T cette surcharge va no être utilisé par l'allocateur par défaut.

7voto

R Sahu Points 24027

Est-ce garanti par la norme ?

Tant que vous n'utilisez pas un allocateur personnalisé pour créer une instance d'un conteneur, je pense que c'est vrai.

En http://en.cppreference.com/w/cpp/memory/allocator

Le site std::allocator est l'allocateur par défaut utilisé par tous les conteneurs de la bibliothèque standard si aucun allocateur spécifié par l'utilisateur n'est fourni.

et

En http://en.cppreference.com/w/cpp/memory/allocator/allocate :

Attribue n * sizeof(T) octets de stockage non initialisé en appelant ::operator new(std::size_t)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X