Où vivent les foncteurs std :: bind-created?

Un pointeur de fonction peut pointer sur une fonction libre, un object de fonction, un wrapper sur un appel de fonction membre.

Cependant, les foncteurs créés par std :: bind peuvent avoir un état, ainsi que ceux créés sur mesure. Où cet état est alloué et qui le supprime?

Prenons l’exemple ci-dessous: l’état (le nombre 10) sera-t-il supprimé lorsque le vecteur est supprimé? Qui sait appeler un deleter sur le foncteur, et aucun deleter sur le pointeur de la fonction?

#include  #include  #include  using namespace std; using namespace std::placeholders; class Bar { public: void bar(int x, int y) { cout << "bar" << endl; } }; void foo(int baz){ cout << "foo" << endl; } int main() { typedef std::function Func; std::vector funcs; funcs.push_back(&foo); // foo does not have to be deleted Bar b; // the on-the-fly functor created by bind has to be deleted funcs.push_back(std::bind(&Bar::bar, &b, 10, _1)); // bind creates a copy of 10. // That copy does not go into the vector, because it's a vector of pointers. // Where does it reside? Who deletes it after funcs is destroyed? return 0; } 

std::bind renvoie un object par valeur (le type exact de l’object est un détail d’implémentation de la bibliothèque standard). Cet object stocke tous les états nécessaires et son destructeur effectue tout le nettoyage requirejs.

Notez que votre vecteur ne stocke pas les pointeurs – il stocke les objects std::function . Un object std::function stocke en interne l’object à partir duquel il a été créé (un pointeur de fonction ou l’object renvoyé par std::bind dans votre cas) et son destructeur détruit correctement l’object stocké. Détruire un pointeur pour fonctionner ne fait rien. La destruction d’un object de type classe appelle son destructeur.

La fonction std::bind crée une instance d’une classe non spécifiée. Lorsque cet object sort de son cadre et est détruit, le stockage de cette instance l’est également.

Tout comme les instances de toute autre classe avec un destructeur qui libère une ressource.