jeanlandercy
Messages postés9Date d'inscriptionmardi 22 février 2005StatutMembreDernière intervention26 mars 2005
-
5 mars 2005 à 17:18
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 août 2008
-
6 mars 2005 à 14:40
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
A voir également:
Comment détruire une instance d'une classe dans un programme java
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 5 mars 2005 à 18:32
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:
#include
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* m = new Maillon;
delete m;
m->f();
return 0;
}
Après le delete, on a toujours le droit de modifier m->n (qui chez moi à été modifié pendant le delete).
jeanlandercy
Messages postés9Date d'inscriptionmardi 22 février 2005StatutMembreDernière intervention26 mars 2005 6 mars 2005 à 01:01
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 ???
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 6 mars 2005 à 01:29
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.
jeanlandercy
Messages postés9Date d'inscriptionmardi 22 février 2005StatutMembreDernière intervention26 mars 2005 6 mars 2005 à 01:40
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
jeanlandercy
Messages postés9Date d'inscriptionmardi 22 février 2005StatutMembreDernière intervention26 mars 2005 6 mars 2005 à 01:55
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).
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 6 mars 2005 à 08:32
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....
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 6 mars 2005 à 10:51
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.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 6 mars 2005 à 11:14
Je ne savais pas qu'on pouvait accéder dans le tas à des zones non
allouées... En fait j'ignorais qu'il y avait un tas pour chaque
processus. Mais dans ce cas il y a un truc que je ne comprends pas: la
taille du tas pour un process donné est-elle succeptible de changer
pendant l'exécution? Parce que chaque processus est capable de
d'allouer autant qu'il veut tant qu'il y a de la mémoire...
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 6 mars 2005 à 11:43
Le système d'exploitation ne peut pas passer son temps à traiter les allocations mineures de chaque process. En bref, il attrribue aux process, de manière dynamique, un ou plusieurs segments de mémoire pour les allocations dynamiques, le code et la pile (et les variables d'état du process). La structure, la taille et la technique de reservation des segments dépend du système...;
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 août 2008 6 mars 2005 à 12:13
de toute facon si vraiment ça t'embete, vu que tu est sous windows XP, tu fait une boucle d'allocation et désallocation de mémoire et tu va voir dans les ressource comment ça se déroule (ctrl + alt + suppr), si ya un probleme ta mémoire va grimper en fleche :) C'est une méthode bourrin mais quand on fait des jeux c hyper pratique pour voir si ya pas de "fuites" de mémoire...
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 6 mars 2005 à 13:21
Tu n'apprendras pas grand chose. Les fonctions new et delete masquent des opérations complexes de bas niveau qui n'ont plus rien a voir avec la programmation.
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 août 2008 6 mars 2005 à 14:40
Non mais quand on débute et que l'on a des doutes sur comment se passent les allocation mémoire c'est un bon moyen de s'assurer si notre programme gère correctement la mémoire (quand je débutait par exemple je ne savai pas trop comment cela se passait pour les chaines de caractère). Mais cela reste valide que si tu le fait beaucoup parceque sur tu allou 1 octet je ne suis pas sur que cela se voit dans le gestionnaire de ressource (par exemple en java lorsque tu augmente la taille d'un tableau dynamique de 1 case il se peut que le prog n'allou pas de mémoire supplémentaire car elle a déjà été allouée pour des raisons d'optimisation).