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 :

Comment le language désalloue un type personnalisé


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 23
    Points : 19
    Points
    19
    Par défaut Comment le language désalloue un type personnalisé
    Bonjour,
    Je me demandait comment en natif un langage sait comment désallouer en mémoire un type personnalisée, une classe etc, avec un pointeur et le mot clé delete ? est-ce que a la fin de la classe il y a le caractère spécial '/0' ou ça se passe autrement ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonsoir,

    Ça dépend de ce que tu appelles « désallouer un type personnalisé », et cela dépend aussi grandement du langage que tu utilises. Ces considérations ne seront pas du tout les mêmes si tu utilises un langage compilé ou s'il est interprété. Au passage, les « classes » et l'opérateur « delete » sont l'apanage du C++. Ils n'existe pas en langage C.

    Lorsque tu définis une macro avec #define, tu peux l'oublier avec #undef. En revanche, tu ne peux pas annuler une déclaration de type menée avec typedef ou avec les mot-clé class ou struct. Par contre, ces définitions ont la même portée que les variables (et se déclarent suivant la même syntaxe), si bien que le type personnalisé ainsi déclaré ne sera défini qu'à l'intérieur du bloc où il a été déclaré. C'est pour cela qu'en général, on les définit au niveau global.

    Si ce sont les instances de ces types que tu veux supprimer (c'est-à-dire les variables déclarées), alors il y a deux possibilités. Soit ce sont des variables locales ordinaires allouées dynamiquement sur la pile, soit ce sont des objets engendrés par new et delete (en C++ uniquement). Dans le premier cas, on réserve simplement la place nécessaire à ces variables sur la pile, et cette place est libéré en fin de bloc en vidant la pile.

    Quand tu utilises, en C++, « un pointeur et le mot-clé delete », tu ne dois le faire que sur un objet qui a au préalable été alloué avec new. Il s'agit en fait de routines d'allocation mémoire similaire à malloc() et free() en langage C. Ça ne fonctionne pas avec un caractère « \0 » en fin de classe, mais ces routines tiennent à la place une liste des zones allouées avec des méta-données. Ces méta-données indiquent la taille de la zone allouée et la nature de l'objet qui y loge.

    La différence, ici, entre C et C++, est que dans les deux cas, l'apparition d'un objet provoque l'appel automatique de son constructeur pour l'initialiser correctement (principe appelé RAII) et de son destructeur juste avant de libérer son espace, s'ils existent bien sûr.

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Si ton inquiétude est : comment le système sait-il où se termine l'instance qui doit disparaître?
    Dans le cas d'une instance locale à un bloc, au moment de la sortie du bloc le compilateur connait bien le type et la localisation de la variable car il vient d'en générer le code, il en connait donc sa taille exacte.
    Dans le cas d'une instance globale, la mémoire sera totalement libérée en quittant l'application, donc peu importe la taille.
    Dans la cas d'une instance allouée par new ou par new[], le système retourne un pointeur mais en réalité il a alloué un bloc légèrement plus grand et a ajouté des informations qu'il utilisera lors de l'appel à delete ou delete[].
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Bloc alloué +--------+--------+---------------------------------------------------+
                |LgTotale| NbItems| zone disponible pour les données                  |
                +--------+--------+---------------------------------------------------+
                                   ^
                                    \_________ Le pointeur qui est retourné par new et new[]

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Dans la cas d'une instance allouée par new ou par new[], le système retourne un pointeur mais en réalité il a alloué un bloc légèrement plus grand et a ajouté des informations qu'il utilisera lors de l'appel à delete ou delete[].

    Génial ça merci tu répond parfaitement à ma question donc il y a une petite structure de données avant l'objet ! je n'étais pas au courant ! c'est normaliser il y a une doc sur ça ? on peut la modifier ?

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hobouu Voir le message
    est-ce que a la fin de la classe il y a le caractère spécial '/0'?
    Bonjour

    Un caractère spécial quel qu'il soit (\0, esc, point-virgule, pipe) n'a de sens "spécial" que dans un contexte où on ne risque pas de le trouver "par accident". Par exemple, une chaine de caractères ne contenant que des caractères "affichables" (donc avec un code ascii compris entre 0x40 et... je sais pas exactement mais on va dire 0xe0) n'aura aucune chance d'avoir de façon accidentelle un caractère 0x00. Donc ce caractère pourra servir de valeur "spéciale" indiquant un truc particulier (comme "fin de chaine").

    Une classe (objet binaire) pouvant contenir toute la gamme du code ascii, pour elle, aucun caractère "spécial" quel qu'il soit ne pourra fonctionner...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Citation Envoyé par hobouu Voir le message
    donc il y a une petite structure de données avant l'objet ! je n'étais pas au courant ! c'est normaliser il y a une doc sur ça ? on peut la modifier ?
    En tout cas, ce n'est pas normalisé dans le standard C++. Lors d'un appel à delete[], le compilateur se débrouille comme il veut pour savoir combien d'objets il faut détruire puis combien d'octets il faut désallouer.
    Exemple de deux techniques possibles pour implémenter delete[] : https://isocpp.org/wiki/faq/freestor...s-in-new-array

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Pyramidev Voir le message
    En tout cas, ce n'est pas normalisé dans le standard C++. Lors d'un appel à delete[], le compilateur se débrouille comme il veut pour savoir combien d'objets il faut détruire puis combien d'octets il faut désallouer.
    Exemple de deux techniques possibles pour implémenter delete[] : https://isocpp.org/wiki/faq/freestor...s-in-new-array
    Très intéressant ! j'aurais pensé qu'il y aurait quand même un consensus sur ce procédé mais non, merci

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/02/2016, 01h10
  2. [Sql] Comment inserer un champs de type Date ?
    Par ridondo dans le forum DB2
    Réponses: 4
    Dernier message: 28/11/2005, 14h40
  3. Réponses: 9
    Dernier message: 27/10/2005, 18h15
  4. Comment appeller un ActiveX de type Exe en JAVASCRIPT ?
    Par mandarindi dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/03/2005, 09h57
  5. Comment inserer des donnee de type Large Object !!
    Par josoft dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/07/2003, 11h21

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