IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Soucis de destructeur


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut Soucis de destructeur
    Bonsoir,

    J'ai réalisé une classe pour permettant de manipuler des "polynômes"
    Quand test mon constructeur par défaut, tout ce passe bien.. Mais quand j’appelle ma fonction "create_empty_polynom()", le soft plante au moment du destructeur...
    J'ai tout vérifier, comparer avec mes anciens projet similaire, mais je ne trouve pas d’où ça peut venir...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    #include "stdafx.h"
    #include "Polynom.h"
     
     
    //### PUBLIC ####################################################################
    //###############################################################################
     
    //_______________________________________________________________________________
    // CONSTRUCTOR
     
    Polynom::Polynom():
    	deg(0)
    {
    	double* buffer = new double[deg+1];
    	buffer[0] = 0;
    	polynom = buffer;
    }
     
    Polynom::Polynom(unsigned int new_deg):
    	deg(new_deg)
    {
    	double* buffer = new double[deg+1];
    	for(unsigned int i=0; i<=deg; i++)
    	{
    		buffer[i] = 0;
    	}
    	polynom = buffer;
    }
     
    Polynom::Polynom(double new_value):
    	deg(0)
    {
    	double* buffer = new double[deg+1];
    	buffer[0] = new_value;
    	polynom = buffer;
    }
     
    Polynom::Polynom(const Polynom& CopyPolynom):
    	deg(CopyPolynom.get_deg())
    {
    	double* buffer = new double[deg+1];
     
    	for(unsigned int i=0; i<=deg; i++){
    		buffer[i] = CopyPolynom.get_polynom_element(i);
    	}
    	polynom = buffer;
    }
     
    Polynom::~Polynom()
    {
    	if (polynom != NULL)
    	{
    		std::cout << "Entry of Monster Destructor !!!!!!!!!!!!! ";
    		delete [] polynom;
    		std::cout << "Exit of Monster Destructor !!!!!!!!!!!!!!";
    	}
    }
     
    //_______________________________________________________________________________
    // GET/SET
     
    unsigned int Polynom::get_deg() const
    {
    	return deg;
    }
     
    void Polynom::set_deg(unsigned int new_deg)
    {
    	deg=new_deg;
    	create_empty_polynom(deg);
    }
     
    void Polynom::set_deg()
    {
    	std::cin >> deg;
    	create_empty_polynom(deg);
    }
     
    double Polynom::get_polynom_element(unsigned int index) const
    {
    	return polynom[index];
    }
     
    void Polynom::set_polynom_element(unsigned int index, double new_value)
    {
    	polynom[index] = new_value;
    }
     
    void Polynom::set_polynom_element()
    {
    	unsigned int index;
    	double new_value;
    	std::cout << std::endl << "Entrez le degres du coefficient: ";
    	std::cin >> index;
    	std::cout << std::endl << "Entrez la valeur du coefficient: ";
    	std::cin >> new_value;
    	polynom[index] = new_value;
    }
     
    double* Polynom::get_polynom() const
    {
    	double* buffer = new double[deg+1];
    	for(unsigned int i=0; i<=deg; i++)
    	{
    		buffer[i] = polynom[i];
    	}
    	return buffer;
    }
     
    void Polynom::set_polynom(const Polynom& CopyPolynom)
    {
    	deg = CopyPolynom.get_deg();
    	create_empty_polynom(deg);
    	for(unsigned int i=0; i<=deg; i++)
    	{
    		polynom[i] = CopyPolynom.get_polynom_element(i);
    	}
    }
     
    //_______________________________________________________________________________
    // METHOD
     
    void Polynom::fill_polynom()
    {
    	double value;
    	std::cout << std::endl << "C'est un polynome de degre(s) " << deg;
    	std::cout << std::endl;
    	view_polynom();
    	for(unsigned int i=0; i<=deg; i++)
    	{
    		std::cout << std::endl << "Rentrez la valeur du coefficient de degre " << i << std::endl;
    		std::cin >> value;
    		polynom[i] = value;
    		std::cout << std::endl;
    		view_polynom();
    	}
    	std::cout << std::endl << std::endl << "Polynome rempli.";
    }
     
    void Polynom::define_polynom()
    {
    	std::cout << "Entrez le degres du polynome: ";
    	set_deg();
    	fill_polynom();
    }
     
    void Polynom::create_empty_polynom(unsigned int new_deg)
    {
    	deg = new_deg;
    	double* buffer = new double[deg];
    	for(unsigned int i=0; i <=deg; i++)
    	{
    		buffer[i] = 0;
    	}
    	delete [] polynom;
    	polynom = buffer;
    }
     
    Polynom operator + (const Polynom& p1, const Polynom& p2)
    {
    	unsigned int tmp_deg;
    	if(p1.get_deg() < p2.get_deg())
    	{
    		tmp_deg = p2.get_deg();
    	} else {
    		tmp_deg = p1.get_deg();
    	}
    	Polynom tmp_pol(tmp_deg);
    	for(unsigned int i=0; i<=tmp_pol.get_deg(); i++)
    	{
    		tmp_pol.set_polynom_element(i, p1.get_polynom_element(i) + p2.get_polynom_element(i));
    	}
    	return tmp_pol;
    }
     
    Polynom operator - (const Polynom& p1, const Polynom& p2)
    {
    	unsigned int tmp_deg;
    	if(p1.get_deg() < p2.get_deg())
    	{
    		tmp_deg = p2.get_deg();
    	} else {
    		tmp_deg = p1.get_deg();
    	}
    	Polynom tmp_pol(tmp_deg);
    	for(unsigned int i=0; i<=tmp_pol.get_deg(); i++)
    	{
    		tmp_pol.set_polynom_element(i, p1.get_polynom_element(i) - p2.get_polynom_element(i));
    	}
    	return tmp_pol;
    }
     
    Polynom operator * (const Polynom& p1, const Polynom& p2)
    {
    	unsigned int tmp_deg = p1.get_deg() * p2.get_deg();
    	Polynom tmp_pol(tmp_deg);
     
    	for(unsigned int i=0; i<=p1.get_deg(); i++)
    	{
    		for(unsigned int j=0; j<=p2.get_deg(); j++)
    		{
    			tmp_pol.set_polynom_element(i+j, p1.get_polynom_element(i)*p2.get_polynom_element(j)+tmp_pol.get_polynom_element(i+j));
    		}
    	}
    	return tmp_pol;
    }
     
     
    void Polynom::operator = (const Polynom& p)
    {
    	if(this != &p)
    	{
    		deg = p.get_deg();
    		create_empty_polynom(deg);
    		for(unsigned int i=0; i<=deg; i++)
    		{
    			polynom[i] = p.get_polynom_element(i);
    		}
    	}
    }
     
    void Polynom::view_polynom() const
    {
    	std::cout << std::endl << "[";
    	for(unsigned int i=0; i<=deg; i++)
    	{
    		std::cout << " " << polynom[i] << " ";
    	}
    	std::cout << "]";
    }
     
    //### PROTECTED #################################################################
    //###############################################################################
     
    //### PRIVATE ###################################################################
    //###############################################################################
     
     
    void testPolynom()
    {
    	Polynom p;
    	std::cout << "Rentrez le nouveau degres du polynome: ";
    	p.create_empty_polynom(3);
    }

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Ligne 150, double* buffer = new double[deg+1] ?

  3. #3
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Salut,

    il y a beaucoup de choses à revoir dans ton code, notamment au niveau de la gestion de la mémoire mais je pense que tu vas t'en rendre compte petit à petit en l'utilisant. En ce qui concerne plus précisément ta question, je pense que le problème vient de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Polynom::create_empty_polynom(unsigned int new_deg)
    {
    	deg = new_deg;
    	double* buffer = new double[deg];
    	for(unsigned int i=0; i <=deg; i++)
    	{
    		buffer[i] = 0;
    	}
    	delete [] polynom;
    	polynom = buffer;
    }
    où tu alloues comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double* buffer = new double[deg];
    au lieu de le faire comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double* buffer = new double[deg+1];

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Cela venait bien de la... Ce sont les choses les plus simples qui me bloque souvent ^^

    Peut tu m'en dire un peu plus sur la mauvaise gestion de la mémoire ? Je débute, et je doit bien avoué que je ne sais pas trop comment faire =)

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    • polynom devrait être un std::vector, ce qui simplifierait immensément la gestion des "ressources dynamiques" que sont les coefficients du polynôme. Tu n'aurais quasiment rien à faire dans les constructeurs/méthodes/destructeur de Polynom à part rediriger vers std::vector, ce qui t'épargnerait des SEGFAULT et des fuites mémoire.
    • C'est un très mauvaise idée de donner à Polynom(unsigned int) et Polynom(double) des objectifs aussi différents. Si l'utilisateur fournit le mauvais type sans s'en rendre compte (exemple: via une fonction dont le type de retour n'est pas clair, ou via une expression 3/2 maladroitement interprétée comme "double") alors le mauvais constructeur sera appelé, polynom n'aura pas la même taille, ce qui peut mener à un plantage dont l'origine est difficilement décelable.
    • L'utilisation de std::cin std::cout dans Polynom ne me parait peut-être pas judicieuse d'un point de vue conception... En tant qu'utilisateur j'aurais moyennement envie que Polynom tripatouille d'elle-même mes Entrées/Sorties, à choisir je passerais plutôt mon polynôme à une fonction libre du genre stdioFeed(Polynom& p), mais bon, ça reste secondaire...
    • Le get_polynom() qui renvoie un double* qui n'est détenu/géré par aucun objet est une pure hérésie. C'est une source quasi-certaine de fuites mémoire si l'appelant ne prend pas l'initiative de "delete" ce double*. Problème résolu si get_polynom() retourne un std::vector.
    • Pas besoin de répéter "polynom" dans tous les noms de méthodes. L'intérêt des méthodes est justement de savoir qu'on se trouve dans le contexte d'un polynôme...

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Alors en faite, le gentil professeur ne veut pas qu'on utilise le std::vector... Pour bien qu'on voit tout les problèmes que tu me cite.

    Il est vrai que mon nommage n'est pas très judicieux...

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Salut,

    Ceci dit, le test sur if (polynom != NULL) ne sert strictement à rien dans le destructeur (par contre, il devrait etre quasi systématique lorsque tu veux accéder à ce qui est pointé par ton pointeur ):

    delete et delete[] ont en effet une garantie de non exécution si le pointeur a une valeur NULL, ce qui fait que, pour ce qui est du delete en tout cas, tu peux y aller sans avoir à t'inquiéter

    De toutes manières, si tu as fait une c**rie (comme celle de copier le pointeur, mais de ne pas faire une copie en profondeur en demandant une nouvelle allocation dynamique et en copiant le contenu de la mémoire de la source vers l'origine), ce n'est pas cela qui te sauvera des différents problèmes que tu peux rencontrer...

    Le gros des problèmes que l'on rencontre sur un delete ne viennent pas d'un pointeur qui vaudrait NULL (comme je l'ai dit, delete se charge de le vérifier) mais plutôt d'une double tentative de libération de la mémoire (l'adresse mémoire pointée a déjà été libérée par ailleurs) ou d'une tentative de libération de mémoire qui n'a pas été allouée dynamiquement
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    As-tu vu les points suivants en cours?
    - surcharge d'opérateur
    - exceptions
    - template

    EDIT : pour la surcharge, j'ai trouvé la réponse dans ton code

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Oui pour la surcharge =)

    Les exceptions je suis en train de les rajouter, pour gérer les histoires de OutOfRange.

    On a vu les Template, mais je ne voit pas trop à quoi cela pourrait me servir dans ce cas.

  10. #10
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    D'accord. Et quels sont les consignes/énoncés donnés par ton enseignant?

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Est-ce qu'il serait envisageable de définir une classe MyVector équivalente à std::vector, puis l'utiliser dans Polynom ?
    Ça permettrait de séparer :
    • MyVector : la gestion en mémoire (alloc, remplissage, resize, copy, desalloc, etc) d'un vecteur d'éléments scalaires.
    • Polynom : la gestion des opérations mathématiques relatives à un polynôme, dont les coefficients se trouvent -- par commodité -- être gérés par un MyVector.

  12. #12
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Hummm en faite c'est tout un projet pour simuler et analyser des systèmes à temps discret sous formes d'état et fonctions de transferts.
    L'énoncé nous donnes juste quelques pistes, et donne assez de libertés.


    Cela peut être envisageable.

  13. #13
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Ok. Désolé pour l'interrogatoire mais les questions arrivent au fur et à mesure de tes réponses.
    Quelle(s) classe(s) envisages-tu d'implémenter et quelles sont les relations hiérarchiques entre elles si elles existent?

  14. #14
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    J'ai fait une classe "Signal" qui est maitre des toutes mes différents signaux: "Sinus", "Step"...

    J'ai ensuite faite une classe "StateSystem" et "TransfertFunction" qui manipule respectivement des objets de classe "Matrix" et "Polynom".

  15. #15
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Pourrais-tu envoyer les fichiers d'en-tête et uniquement eux pour qu'on se fasse une idée des fonctionnalités de chaque classe?

    Tu sembles avoir choisi de nommer tes classes en anglais. Dans ce cas,
    - sinus devient sine
    - cosinus devient cosine
    - polynôme devient polynomial
    - fonction de transfert devient transfer function

    Pour le moment, cela ne sert à rien de mettre les mains dans le cambouis, mieux vaut réfléchir sur ce dont tu as besoin et comment l'organiser. Par exemple, l'idée de cob59 d'avoir une classe gérant les tableaux dynamiques me semble plus qu'approprié dans ton cas car tu vas au moins la réutiliser pour les classes polynomial et matrix.

  16. #16
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Je vous posterait tout ça demain.

    Il était bien précisé qu'il fallait deux classes différentes pour manipuler les Matrice ou le Polynômes, on avance par "étape" sur les séances de Tp... Pas très productif quoi =/

  17. #17
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Ok. Oui, il faudra bien deux classes différentes pour manipuler les polynômes et les matrices, c'est bien normal.
    Mais rien n'empêche d'éviter de coder deux fois la même chose en ayant sous la main une tierce classe qui gère la mémoire.

  18. #18
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Arf il aime pas trop le bougre ^^

Discussions similaires

  1. ASM + DELPHI ... soucis ... mais top intéressant !
    Par - Robby - dans le forum Langage
    Réponses: 9
    Dernier message: 21/11/2003, 15h58
  2. [langage] ptit souci de syntaxe
    Par marouanitos dans le forum Langage
    Réponses: 2
    Dernier message: 26/09/2003, 10h28
  3. [File et Directory ListBox] Soucis de filtre
    Par Mercilius dans le forum Composants VCL
    Réponses: 8
    Dernier message: 04/04/2003, 16h17
  4. Réponses: 4
    Dernier message: 16/02/2003, 12h16
  5. Réponses: 2
    Dernier message: 03/10/2002, 17h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo