begin process at 2012 05 30 04:36:32
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Divers

 > 

surcharge delete


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

surcharge delete

mercredi 24 mai 2006 à 02:52:37 | surcharge delete

koala01


Salut,

Je m'adresse à vous car je suis confronté à un problème qui me  fait perdre mon latin...

Je souhaites créer un "gestionnaire de mémoire" dans le but de traquer les fuites mémoires dans une application.

Pour ce faire, j'ai créé une classe, CManagerMemoire, transformée en singleton pour la cause, qui prend en charge la surveillance des allocations/libérations de mémoire.

Pour ce faire, elle dispose, principalement, de trois méthodes:

  • Getinstance qui renvoie une référence sur l'instance statique de mon gestionnaire,
  • Alloue(std::size_t taille,bool tableau,const std::string&  fichier,int ligne) qui prend en charge l'allocation du pointeur et l'introduction des informations qui le concerne dans une map
  • Libere(void *ptr) qui se charge de libérer le pointeur et de le supprimer de la map de controle.
Pour qu'elle puisse travailler à son aise, j'ai créé dedans une structure  Bloc qui permet de garder l'ensemble des informations que je souhaites surveiller (taille du bloc alloué, fichier et ligne où l'allocation a lieu, s'il s'agit ou non d'un tableau).

Cest informations sont gardées, pendant leur période de validité, dans une map dont la clé n'est autre que l'adresse du pointeur alloué(std::map(void*, Bloc))

Pour que l'appel à cette classe soit effectué automatiquement, j'ai surchargé new,new[], delete et delete[] sous les formes de

inline void* operator new(std::size_t taille,const std::string &fichier, int ligne)
{
    return CManagerMemoire::GetInstance().Alloue(taille, false, fichier, ligne);     
};
inline void* operator new[](std::size_t taille,const std::string &fichier, int ligne)
{
    return CManagerMemoire::GetInstance().Alloue(taille, true, fichier, ligne);
};
 
inline void operator delete(void *ptr)
{
    CManagerMemoire::GetInstance().Libere(ptr, false);     
};
inline void operator delete[](void *ptr)
{
    CManagerMemoire::GetInstance().Libere(ptr, true);     
};

J'ai enfin créé un macro préprocesseur qui redéfini new pour qu'il appelle automatiquement les new précités sous la forme de

#define new new(__FILE__,__LINE__)

Si l'allocation se passe sans problème, qu'il s'agisse de l'utilisation de new ou de new[], je me retrouve confronté à une problème bisard en ce qui concerne delete...

En effet, tant que j'utilses delete[], il n'y a aucun problème (hormis, bien sur, le fait que je fais une vérification pour savoir si c'était ou non un tableau)

Par contre, dés que j'essaie d'utiliser delete, je me retrouve immanquablement avec une erreur de segmentation...

Je sais (ou du moins, je crois savoir...FIXME ) par mes lectures qu'il est tout à fait légal d'utiliser l'opérateur delete[] alors que l'on a créé notre  objet avec new...

La solution "de facilité" serait alors de supprimer la surcharge de delete, de supprimer la vérification du fait qu'il s'agisse ou non réellement d'un tableau, et d'utiliser systématiquement delete[], qui fonctionne très bien, au lieu de delete, et ce même si new avait été utilisé...

L'astuce, c'est que si je peux parfaitement m'arranger de cet état de fait, principalement parce que je le saurais, cette solution ne présente qu'un pis-aller dans le sens où, si pour une raison ou une autre, quelqu'un vient à utiliser cette classe (soit parce qu'il la jugeait intéressante, soit parce qu'il voudrait participer au développement d'un projet ambitieux qui l'utiliserait)... il risque de ne pas être au courent (ou simplement d'oublier) qu'il faut en permanence utiliser delete[]...

Le résultat étant que, dans un premier temps il pestera dans toutes les langues de l'arc-en-ciel "mais je l'ai pourtant libérée, cette mémoire", et dans un deuxième temps,  il n'y  fera plus attention...("mais oui, j'ai soi disant oublié de libérer la mémoire de mon pointeur")

Bref, je préférerais me passer de cette classe plutot que de ne pas la voir entièrement fonctionnelle

J'ai essayé de la compiler aussi bien sous  dev-c++(mingw sauf erreur) que sous GCC (sous linux) et le problème persiste.

Vu que ce message devient déjà kilométrique, vous trouverez le code complet ==>ici<==.  Si vous aviez la moindre idée de la raison pour laquelle ca ne veut pas fonctionner, je vous en supplie, venez à mon secours... (toute remarque constructive sera forcément prise en compte)

Merci d'avance

Ce qui ce conçoit bien s'énonce clairement
et les mots pour le dire vous viennent aisément

" http://nonapalladium.be.tf" luttons contre palladium[/url
jeudi 25 mai 2006 à 13:42:22 | Re : surcharge delete

koala01

Réponse acceptée !
Bon, ben, je me réponds à moi meme pour le cas où quelqu'un d'autre serait intéressé...

Il *semblerait* que le problème venait du fait que j'avais mis un fichier de sortie comme membre de ma classe, et que  je faisais des appels à ce fichier pour chaque opération.

J'ai modifié un peu les différentes structures et les méthodes de manière à ce que le fichier de log ne soit plus membre de la classe, mais simplement ouvert au moment où l'on souhaite effectuer une sauvegarde des opérations (en gros, quand on détruit l'instance du gestionnaire de mémoire).

Bien qu'il est préférable que je prenne le temps de maltraiter un peu la classe avant de crier victoire, le code modifié se trouve ==>ICI<== pour le cas où il pourrait intéresser quelqu'un



Ce qui ce conçoit bien s'énonce clairement
et les mots pour le dire vous viennent aisément

" http://nonapalladium.be.tf" luttons contre palladium[/url


Cette discussion est classée dans : fichier, taille, void, delete, std


Répondre à ce message

Sujets en rapport avec ce message

VNEZ TOUS VOIR SA !! [ par Mickylord ] regardez , je ne sais pas comment faire pour ecrire une valeur numerique dans un fichier .txt . Comment je fait ???:void EcrireDisque (void) //SA Taille d'un fichier [ par mimieivd ] Hello !Pourriez vous expliquer à une bande de novice comment faire pour avoir la taille d'un fichier svp ???merci la compagnie ? Taille de ma structure [ par crocejf2000 ] Salut a tous, J'ai un tres gros probleme qui me bloque toute mon avancé dans mon prog : j'ai une structure : typedef struct{ unsigned short Locate; ch nombre de caractère [ par mig73 ] salut à tousje suis sous visual c++.netj'ai utilisé la fonction suivante:CFile::GetLenght qui me donne la taille en octet du fichier que je lisA parti recherche fichiers executables et comparaisons [ par limsa033 ] Bonsoir,je cherche à lister tous les fichiers executables d(un disque dur ainsi que leur principales caractéristiques(nom,chemin et taille et date de Taille Fichier, SVP !!! [ par manta7 ] Bonjour un personne m'a donne cette source pour connaitre la taille d'un fichier :DWORD taille = GetFileSize(hfl, 0);mais comme je suis un gros NewB, Lire la taille d'un fichier avec la DTA [ par metman ] Comment pouvons-nous avoir la taille d'un fichier a partir des octets 26 27 28 29 de la DTA ?Intéruption 21hfonction 4foctect 26 - 27 = mot faible de ouverture de fichier avec les MFC [ par steph76 ] Bonjourvoila je programme une application qui ha beusoin d'ouvrir 1 fichier via httpJ'ai donc fait le code suivantCStdioFile *file;CInternetSession IS manipulation fichier texte [ par bencholl ] I / Utilisation de fichiers texteLe fichier "Etud_2002.don" comporte des lignes ainsi structurées (le caractère ';' est utilisé comme séparateur) : NO ecrire dans un fichier [ par bellionl ] salut,voila depuis une semaine je tente de conprendre le c++ avec borland c++ builderle problème est quand je veut écrire dans un fichier.création du


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,290 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales