Objet detruit deux fois dans un for_each ?
Bien le bonjour,
Je viens de tomber sur un `os`, en utilisant pour la premiere fois le for_each de la STL <algorithm>, le destructeur de l'objet function que je lui donne se retrouve appele, par deux fois, a l'interieur du foreach.
Je remercie par avance quelqu'un sachant m'expliquer pourquoi.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class Sum
{
int val;
public:
Sum() : val(0)
{ cout << "CTOR" << endl; }
Sum(int i) : val(i)
{ cout << "CTOR int" << endl; }
~Sum()
{ cout << "DTOR" << endl; }
operator int() const
{ return val; } // extract value
int operator()(int i)
{ return val += i; } // application
};
void f(vector<int> v)
{
cout << "START" << endl;
Sum s = 0; // initial value 0
s = for_each(v.begin(), v.end(), s); // gather the sum of all elements
cout << "the sum is " << s << "\n";
cout << "STOP" << endl;
}
void g(vector<int> v)
{
cout << endl << "OR EVEN" << endl << "START" << endl;
cout << "the sum is " << for_each(v.begin(), v.end(), Sum(0)) << "\n";
cout << "STOP";
}
int main()
{
vector<int> v;
v.push_back(21);
v.push_back(42);
f(v);
g(v);
} |
Rapide explication du code, extremement proche d'un copie-colle de Stroustrup, http://www.research.att.com/~bs/bs_f...unction-object
:
On applique un for_each a un vector, en lui donnant en troismeme parametre un objet function qui fait la somme de ses elements, la fonction f le fait par une methode, le g par une plus concise mais donnant plus ou moins le meme resultat : le destructeur de Sum est appelle deux fois dans le for_each, une troismeme fois pour la fonction 'f', en toute normalitee, a la sortie du scope.
Voila la sortie :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| START
CTOR int
DTOR
DTOR
the sum is 63
STOP
DTOR
OR EVEN
START
CTOR int
the sum is 63
DTOR
DTOR
STOP |
Merci a tous, et desole pour mon clavier QWERTY :mrgreen: