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 :

Variables/objets dynamiques, quelques questions


Sujet :

C++

  1. #1
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut Variables/objets dynamiques, quelques questions
    Bonjour à tous,
    Je me pose quelques questions à propos de variables et objets dynamiques (une partie de ces questions aurait peut-être du être posée dans le forum de développement Windows?!)

    1) Quand je crée un objet dynamique avec un new, j'enregistre logiquement l'adresse retournée dans un pointeur. Imaginons que je copie cette adresse dans un autre pointeur, si je fais un delete en utilisant cet autre pointeur, supprimerais-je bien la totalité de la mémoire allouée (imaginons que j'ai fais un casting et que ce ne soit pas des pointeurs vers le même type de variable)?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int* c = new int;
    long* d = (long*)c;
    delete d;
    2) (En rapport avec la 1) Lorsque je fais un new, y-a-t-il création d'une sorte de tableau de références où sont enregistrées pour chaque adresse allouée la taille de la zone allouée? (Dont le delete se servirait pour connaître la taille à désallouer)

    3) Que se passe-t-il si je fais un delete à une adresse qui n'a pas été allouée dynamiquement?

    3bis) Que se passe-t-il si j'ai alloué un tableau (de 10 éléments par exemple) et que je fais un delete[] mais comme ceci4) Si j'alloue un tableau dynamique, et que plutot de faire un delete[], je fais simplement delete, que vais-je supprimer? Seulement le premier élément de ce tableau?

    5) Si j'oublie de désallouer une zone de mémoire allouée dynamiquement, lorsque le programme se termine, la zone de mémoire sera automatiquement supprimée par l'OS (Windows pour ma part)?

    Merci d'avance,
    Crisanar

  2. #2
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Salut!
    2) je pense que oui, il observe l'objet qui se trouve à cet emplacement et suprime les bonnes zones en fonctions de son type(int, double, etc.)
    4) Là aussi j'ai l'impression que oui: l'adresse est celle du premier objet -> seul le premier est détruit. Quand tu passe un tableau comme arguement c'est seulement l'adresse mémoire du premier objet qui est envoyée.
    5) Quand tu redémarera la mémoire sera de toute façon écrasée.
    Une déclaration comme

    Utilisera de la mémoire qui sera détruite une fois sorti de sa portée. Si tu déclares des objets dynamiques il occupent la mémoire qusqu'à ce que la mémoire soit écrasée. Elle j'en suit quasi certain Windows ne fait pas cela
    Désolé si je n'ai pas répondu à tout

  3. #3
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    Salut reggae ,
    Merci pour tes informations
    Elle j'en suit quasi certain Windows ne fait pas cela
    Que voulais-tu dire, je n'ai pas compris
    Désolé si je n'ai pas répondu à tout
    C'est déja pas mal et puis certaines réponses répondent à plusieures de mes questions

  4. #4
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Vraiment désolé je confirme c'est incompréhensible...
    Je voulais dire que Windows n'écrasait pas les objets aloués dynamiquement.
    Mais par contre, si Windows ou n'importe quel programme a besoin de plus de mémoire et qu'il n'y en a plus, il y a deux solutions:
    1) il se plante
    2) il affiche un message d'erreur du genre "saturation mémoire" et en cherche à en libérer
    Bonne soirée

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Mon avis sur ton questionnaire :
    Quand je crée un objet dynamique avec un new, j'enregistre logiquement l'adresse retournée dans un pointeur. Imaginons que je copie cette adresse dans un autre pointeur, si je fais un delete en utilisant cet autre pointeur, supprimerais-je bien la totalité de la mémoire allouée
    Oui. Je pense , sans certitude, que les caractéristiques de l'allocation sont inscrites par le processus d'allocation.
    Que se passe-t-il si je fais un delete à une adresse qui n'a pas été allouée dynamiquement?
    Ca plante!
    Si j'alloue un tableau dynamique, et que plutot de faire un delete[], je fais simplement delete, que vais-je supprimer? Seulement le premier élément de ce tableau?
    Je ne crois pas qu'on puisse supposer que l'inscription des caractéristiques de l'allocation par new et par new--- [] soient compatibles. Je pense que dans ce cas, au mieux, le comportement est imprévisible et depend de l'implémentation.
    Si j'oublie de désallouer une zone de mémoire allouée dynamiquement, lorsque le programme se termine, la zone de mémoire sera automatiquement supprimée par l'OS (Windows pour ma part)?
    Tout dépend de l'OS. Je pense que les versions récentes de Windows opèrent un nettoyage mais pas les anciennes.
    Mais attendons les réponses de personnes plus expertes!

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    1/ Oui
    2/ En général, non. Typiquement, les informations du type taille du tableau pour que delete[] puisse fonctionner sont stockée juste avant l'adresse retournée par new. Mais c'est un détail d'implémentation, pourquoi le savoir ?
    3/ Boom
    3bis/ Boom
    4/ Boom (sur certains compilateurs, seul le premier élément est supprimé, mais rien n'est garanti)
    5/ Ca dépend de l'OS. Sur un OS digne de ce nom, oui.

  7. #7
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    Merci à tous pour vos informations
    2/ En général, non. Typiquement, les informations du type taille du tableau pour que delete[] puisse fonctionner sont stockée juste avant l'adresse retournée par new. Mais c'est un détail d'implémentation, pourquoi le savoir ?
    J'ai toujours considéré que c'était un plus de connaître le fonctionnement interne de certaines fonctions du langage. Et puis je suis d'une curiosité maladive

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    La mémoire est toujours libérée à la fin du processus, même sous DOS (sauf si expressément demandé par la fonction _dos_keep()

    Par contre, quand il y a des mémoires partagées, etc., ça peut être plus dur (sous Windows, elle disparait quand tous ses handles sont fermés, et la fin d'un processus ferme automatiquement ses handles).
    Sous Unixoïde (HP-UX), il y avait un "truc" qui restait après la fin du processus, mais je ne me souviens plus quoi...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] [Pygame] Quelques questions à propos des "objets visuels"
    Par Sugiuro dans le forum Programmation multimédia/Jeux
    Réponses: 35
    Dernier message: 14/05/2015, 09h17
  2. Déclaration dynamique de variables objets
    Par Anduriel dans le forum Langage
    Réponses: 7
    Dernier message: 04/08/2013, 15h28
  3. quelques questions sur un Shape créé dynamiquement
    Par SmileSoft dans le forum C++Builder
    Réponses: 10
    Dernier message: 09/07/2010, 21h16
  4. Création dynamique de variables objet
    Par Oliv- dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 19/06/2008, 18h17
  5. Réponses: 9
    Dernier message: 27/12/2006, 13h26

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