Accueil > Forum > > > > Suppression d'une instance de classe avec patron
Suppression d'une instance de classe avec patron
samedi 5 mars 2005 à 17:18:53 |
Suppression d'une instance de classe avec patron

jeanlandercy
|
Bonjour,
Je découvre avec joie les patrons de classe. J'ai dans l'idée de créer un patron de maillon pour liste. La conception, c'est ok, mais la suppression c'est pas opérationnel. Je m'explique...
Je crée un maillon générique du genre:
template <class T> class Maillon { public: T Objet; };
Puis une classe de mon imagination pour l'encapsuler dans mon maillon:
class MaClasse { public: int info; };
Ensuite, lorsque je suis dans mon programme, je crée une nouvelle instance (dynamique) avec le patron Maillon dans lequel j'encapsule MaClasse:
Maillon<MaClasse> * monPointeur = new Maillon<MaClasse>;
Jusque là tout se déroule à merveille. Puis, lorsque l'idée me viens de supprimer l'instance dynamique, j'utilise le mot clé delete.
delete monPointeur;
Ce qui ne génère aucune erreur de compilation, et ne semble pas générer d'erreur d'exécution. Seulement, voilà, je suis maniaque et je teste si mon instance existe toujours et là horreur, l'objet dynamique existe toujours et on peut le manipuler correctement. Ce qui a le mérite de m'énerver un peu beaucoup !!!
Comment fait-on pour supprimer cette instance dynamique ? J'ai déjà cherché sur Internet sans trouver de réponse concluante.
Il y a quelque chose de que je dois ignorer et que j'espère l'un de vous sait...
Merci d'avance pour vos futures réponses.
Landercy Jean
|
|
samedi 5 mars 2005 à 18:32:47 |
Re : Suppression d'une instance de classe avec patron

vecchio56
|
Essaie sans les partons et tu verra que tu auras le même problème. Cela
dit je n'explique pas non plus cela. Voila un exemple complet qui
montre le problème:
[code]
#include <iostream>
using namespace std;
template <class T> class Maillon {
int n;
public:
void f();
Maillon();
~Maillon();
};
template<class T> Maillon<T>::Maillon()
{
n = -12;
}
template<class T> Maillon<T>::~Maillon()
{
cout << "destroy" << endl;
}
template<class T> void Maillon<T>::f()
{
n++;
}
int main()
{
Maillon<int>* m = new Maillon<int>;
delete m;
m->f();
return 0;
}
[/code]
Après le delete, on a toujours le droit de modifier m->n (qui chez moi à été modifié pendant le delete).
|
|
dimanche 6 mars 2005 à 01:01:50 |
Re : Suppression d'une instance de classe avec patron

jeanlandercy
|
Bonsoir,
Je dois avouer que c'est la première fois que j'ai ce genre problème avec delete. Jusqu'ici, il s'est toujours contenté de supprimer l'objet. Faut-il comprendre qu'il n'est pas possible de détruire un objet dynamique d'une classe patron ? Ou bien existe-t-il une autre méthode ???
Je reste perplexe...
Merci quand même pour l'éclaircissement.
Jean Landercy
|
|
dimanche 6 mars 2005 à 01:29:28 |
Re : Suppression d'une instance de classe avec patron

xterminhate
|
Apres un delete, la mémoire est libérée. Utiliser le pointeur apres un delete ne peut être empéché ni pendant la compilation ni pendant l'exécution. L'objet existe toujours en mémoire parce qu'il n'a pas été écrasé par une nouvelle allocation.
Cordialement, Xterminhate.
|
|
dimanche 6 mars 2005 à 01:40:08 |
Re : Suppression d'une instance de classe avec patron

jeanlandercy
|
Bonsoir,
Merci pour cette réponse. C'est bien ainsi que je conçois la suppression d'objet dans le tas. Ce qui m'intrigue dans cette histoire, c'est que, d'habitude, lorsque j'utilise un pointeur vers un objet supprimé, j'ai toujours eu une erreur d'exécution, du genre ma console qui plante. Dans le cas actuel, je supprime le maillon, et si je le désire, je peux le remettre dans la liste en modifiant ses données membres (next et prev). Je trouve ça suspect pour un objet supprimé !!!
Merci encore, je vais pousser plus loins mes investigations...
Jean Landercy
|
|
dimanche 6 mars 2005 à 01:55:20 |
Re : Suppression d'une instance de classe avec patron

jeanlandercy
|
Rebonsoir,
Ca m'énerve tellement que je vous envoye un code, je viens de l'écrire et illustre formidablement bien mon problème. Je précise que je développe sur win xp, avec un éditeur texte et le compilateur borland 5 (mais je doute que cela change quelque chose à la nature même de mon problème).
Voici le listing du code "foireux":
--------------------------------------------------------------------------------
#include <iostream> using namespace std;
template <class T> class Maillon { public: T Objet; int data; Maillon<T>() { } ~Maillon<T>() { } };
class MaClasse { public: int data; MaClasse() {} ~MaClasse() {} };
int main() {
// Création d'une instance dynamique: Maillon<MaClasse> * pMMC = new Maillon<MaClasse>; // Modifications des variables membres: pMMC->Objet.data=1; pMMC->data=3; // Affichage: cout << pMMC->data << " " << pMMC->Objet.data << endl; // En théorie une suppression: delete pMMC; // Re modifications des variables membres: pMMC->Objet.data=2; pMMC->data = 9; // Affichage: cout << pMMC->data << " " << pMMC->Objet.data << endl; // Re-suppression (si, si je vous jure, ça fait même pas un erreur à l'exécution !!!) delete pMMC; // Re-re-modification... etc... pMMC->Objet.data=1; cout << pMMC->data << " " << pMMC->Objet.data << endl;
system("PAUSE"); return 0; }
-----------------------------------------------------------------------------------------
Tout ça, ça me dépasse. Moi qui croyait que j'avais comrpis quelque chose. Snif !!!
Merci d'avances pour vos réponses.
Jean Landercy
|
|
dimanche 6 mars 2005 à 08:32:33 |
Re : Suppression d'une instance de classe avec patron

xterminhate
|
Quel est le problème ?
Tu as écrit des données en mémoire.... et tu démontres, en bricolant avec les adresses, qu'en l'absence de réutilisation de cette mémoire, les données y sont encore intactes. Ok, tu as vérifié que le processus de rafraichissement de tes barettes de SDRAM fonctionne bien.
La pérénité des données stockées dans un espace mémoire désalloué n'est pas assurée. Le comportement est indeterminé dans le temps. Même si tes données sont ré-utilisables immédiatement apres le delete, a court terme elles finiront par être écrasées par de nouvelles allocations et provoquer une erreur grave dans l'execution...
Insère quelques new / delete juste apres ton delete pMMC et on en reparle....
Cordialement, Xterminhate.
|
|
dimanche 6 mars 2005 à 09:21:14 |
Re : Suppression d'une instance de classe avec patron

steve_clamage
|
Oui il n'y a aucun problemes, delete detruit l'objet et libere la memoire, apres le pointeur contient une adresse invalide.
Sur la meme idée que xterminhate, réaloue le mème objet juste apres (normalement l'allocateur devrais reservé le meme emplacement mémoire).
|
|
dimanche 6 mars 2005 à 10:38:32 |
Re : Suppression d'une instance de classe avec patron

vecchio56
|
Normalement une zone qui a été désalouée n'est plus accessible par le
programme. Je suis d'accord avec jeandelercy, il y a un vrai problème.
|
|
dimanche 6 mars 2005 à 10:51:32 |
Re : Suppression d'une instance de classe avec patron

xterminhate
|
Je ne vois pas en quoi, accéder au tas qui est réservé au process, est illégale. L'organisation interne du tas n'est pas contrôlé par le système d'exploitation... Le segfault intervient lorsque le process tente d'accéder à une zone mémoire autre que son propre tas.
Cordialement, Xterminhate.
|
|
Cette discussion est classée dans : dynamique, instance, classe, maillon, patron
Répondre à ce message
Sujets en rapport avec ce message
tableau dynamique d'objets [ par jonathan100 ]
Bonjour a tous! Voici mon probleme. J'ai une classe Voiture dans Voiture.h. Dans le programme principal, je souhaite créer un tableau qui contiendra d
Constructeur sur un tableau de classes [ par Supo ]
Lorsque je crée un tableau de classe, disons avecnomdelaclasse instance[10];et que j'ai un constructeur pour cette classe, comment je fait pour donner
Passer une instance de classe dans une mémoire partagée ?? [ par vinvay ]
Comment puis-je passer une instance de classe dans une shared memory, sachant que cette classe contient une structure. J'arrive, dans le deuxième prog
classe et pointeur [ par anduril22 ]
Salut j'ai un petit souci, (erreur de compilation) j'ai une classe qui se compose comme ceci :Dans mon fichier test.h***********************typedef st
probleme de SendMessage [ par kor6k ]
Bonjour,J'ai créé une classe dérivant d'un CButton et dans ma fenêtre principale, je crée une instance de cette nouvelle classe.Je veux pouvoir gérer
[c++] allocation dynamique de tableau [ par anne-lise ]
Re bonjour, j'ai encore un probleme avec les tableaux.J'ai une classe Image et je veux construire un tableau d'objet de la classe Image dynamiquement.
tableau dynamique [ par azkab ]
bonjour,dans mon programme j ai deux classes (classe 'rectangle' et classe 'cercle'). j ai une troisieme classe 'Objet' qui est l aggregation de ces d
Singleton et héritage [ par Dany82 ]
Voila mon probleme:J'utilise le template:template class singleton{protected: // Constructor/Destructor singleton( ) { } // Supprime l instance de la c
fonction qui initialize une instance de classe sans allocation dynamique [ par mmaximum ]
Bonjour à tous,J'ai un petit problème que je n'arrive pas à résoudre: On considère une classe ClassA et une fonction FunctionA.Le constructeur de Clas
initialisation d'une instance de CButton ? [ par equimose ]
--//Equimose//-- je souhaite programmer un soft qui permet de dessiner un pipeline où chaque ramification (ou chaque noeud ) est représenté par un bou
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|