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 :

utilisation correct de l'allocation dynamique (new / delete)


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Points : 57
    Points
    57
    Par défaut utilisation correct de l'allocation dynamique (new / delete)
    Salut à vous tous,

    J'ai deja plusieurs programme en C++, toujours avec Borland, mais ce n'etait jamais des programmes complexes.

    je suis actuelement en stage et je dois faire un programme en c++ avec borland 6. Et je me rends compte que j'ai plein de lacunes . Mes programmes marchaient mais a mon avis ils devaient etre tres mal programmer.

    je voudrais donc des petits conseil sur l'utilisation des new et delete.

    enfaite je ne sais pas vraiment quand il est necessaire, obligatoire ou interdit d'utiliser l'allocation dynamique.
    j'ai beau regarder les tuto et autre cours, je ne trouve pas vraiment de reponse.

    Par exemple pour le programme que je dois faire actuellement,

    je dois afficher un certain de nombre de donnée, toute bien ordonné, et sur plusieurs pages.

    j'utilise donc un PageControl avec les onglet pour naviguer sur les pages et j'y place des StringGrid pour afficher les données.

    Le truc c'est que je me demande si c'est mieux de créer le PageControl dynamiquement ainsi que les StringGrid. Ou si ca n'etait pas utile car ces objet ne prenne pas beaucoup de memoire. Et donc juste chargé mes donénes dynamiquement.

    ensuite je me demandais aussi si je devais supprimer (delete) le PageControl et les StringGrid des que l'utilisateur ne veut plus visualiser ses données ou si je devais juste jouer avec la proprieté visible ?

    Vous devez certainement trouver ces questions idiotes et vous pensez que ca devrait etre logique pour moi. Mais non donc merci pour votre aide.

    Vous pouvez remplacer les explications par des liens explicant clairement le pourquoi du comment de l'allocation dynamique.

    Je vous remercie d'avance.

    Cdt

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Si tu ne fais pas d'alloc dynamique, a priori tu alloues sur la pile, et donc ton objet est détruit quand tu quittes ta fonction. Des fois c'est ce qu'on veut (utilisation locale et temporaire), des fois non (on effectue alors une alloc dynamique).

    Quant au delete, en général il faut un delete pour new. Mais peut etre que les objets de la bibliotheque Borland sont automatiquement détruits (cf FAQ, doc...). Renseigne toi sur les pointeurs intelligents aussi.

    Un petit lien en passant:
    http://cpp.developpez.com/faq/cpp/?page=pointeurs

  3. #3
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut
    bonjour !

    fait appelle a delete a la fermeture du programme, et effectuvement, joue avec les propriete visible.

    Typiquement, fait appelle a new dans les constructeurs de tes formulaires et a deletes dans les destructeurs (c'est ce que je fait avec les winforms, je connais pas borland).
    all your base are belong to us.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    enfaite je sais comment on les utilisent (du moins je pense) mais je ne sais pas vraiement a quel moment ils sont utiles ...

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    La VCL en C++ Builder ne s'alloue qu'avec un new, du fait qu'il s'agit d'un binding en Delphi <-> C++ de la VCL de Delphi. Et que ces derniers ne s'allouent que via un Create. Exemple TList.Create en delphi, donnera TList *lst = new TList(); en C++
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    On les utilise lorsqu'un objet est susceptible d'être réinitialisé à travers des types différents (je pense à l'héritage), ou lorsque que l'on veut qu'un objet ait une portée supérieure à celle dans laquelle on le créé. Entre autres.

    L'une des utilisations principales est le polymorphisme.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    Dans mon application je dois remplir des grille avec des valeurs. Et ces valeurs changent lorsque l'utilsiateur changent de projet. (un peu commme si l'utilisateur faisait ces comptes du moi de septembre dans un projet et qu'il ouvrait un autre projet pour le mio d'octobre).

    Est ce qu'il faut créer ces grilles (StringGrid dans mon cas) dynamiquement et les "deleter" à chaque fois que je change de projets (change de valeurs) ou dois je juste jouer sur les fait qu'elle soit visibles ou non et juste changer les valeurs ?


    (je crois que je viens de repondre à ma question tout seul en me posant la question, c'est bete de créer la grille pour la supprimer puis la recréer juste pour changer les valeurs).

    Je crois que je vais juste la créer au debut puis la supprimer lorsque l'utilisateur quiterra le logiciel.




    Par contre j'ai une autre quetion :

    j'ai un bouton, dans ce bouton je crée un objet ou un autre chose dynamiquement. je veux le "delete" dans un autre bouton.

    Moi je fais comme ça mais ca ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void __fastcall TForm1::boutoncréer(TObject *Sender)
    {
    TStringGrid* pStringGrid = new TStringGrid(Form1);
     
    /* J'utilise l'objet StringGrid */
    }
    puis l'autre bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void __fastcall TForm1::boutoncréer(TObject *Sender)
    {
    delete pStringGrid;
     
    }

    Mais quand je fais delete il me dit qu'il ne connais pas le pStringGrid. Je dois obligatoirement mettre la delcaration de pStrinGrid (TStringGrid* pStringGrid) dans la section public de la Form1.

    Si je met sla déclaration dans la classe de Form1, l'objet n'est pus créer dynamiquement, si ?


    Merci de m'eclaircir, je crois que j'ai encore beaucoup de mal avec l'allocation dynamique (et pas que ça )

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Allocation dynamique et durée de vie de la variable sont deux choses différentes.

    Si c'est un pointeur que tu mets dans la section public: de Form1, l'allocation restera dynamique.


    Quant à l'allocation d'objets sur la pile, elle est dite "automatique". Ça montre que quand un objet est sur la pile, son destructeur sera appelé automatiquement à la fin de la fonction (ou plus précisément, à la fin du bloc).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Allocation dynamique et durée de vie de la variable sont deux choses différentes.

    Si c'est un pointeur que tu mets dans la section public: de Form1, l'allocation restera dynamique.


    Quant à l'allocation d'objets sur la pile, elle est dite "automatique". Ça montre que quand un objet est sur la pile, son destructeur sera appelé automatiquement à la fin de la fonction (ou plus précisément, à la fin du bloc).
    Merci bien ça m'eclairci deja beaucoup.




    Autre question,

    est ce que pour eviter d'emcombrer l'aspect visuelle de votre application sous C++builder vous créer vos objet dynamiquement ?

  10. #10
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Points : 141
    Points
    141
    Par défaut
    tous mes objets sont créés dynamiquement.

    Ormis un seul que je passe en paramètre car il est le centre de mon appli et mes Form ont besoin d'avoir accès à une même classe.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    Ok merci freud44,

    est ci qu'il y aurait d'autre avis sur ça ?

    tout le monde fait comme freud44 ?

  12. #12
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Points : 141
    Points
    141
    Par défaut
    Ma façon de programmer est la suivante:

    tu créés tes form, ensuite une classe Administration qui te servira de classe de gestion de tout ton programme.

    L'objet administration est instancié dans ma Form principale, et est passé en paramètre à toutes les autres Form de mon projet, dans chaque constructeur de chaque form supplémentaire.

    Ta classe Administration instancie des classe de service qui auront différentes fonctions, comme l'impression d'un document...le but étant de te reservir des class de service pour un autre programme sans en changer le contenu.
    C'est ma classe Administration qui gère tout et envoie les bonnes variables en paramètres à chaque classe de service..

    Je ne sais pas si c'est la meilleure méthode, mais en tout cas , c'est bien pratique je trouve.Après si d'autre personnes ont meilleures idées, je suis prenneur

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    meci freud, je comprend mieux.

    Mais jsute un truc. Par exemple tu parle d'impression. Mais qu'est que ta classe administraton envoie à ta fonciton qui gere l'impression ?

    et la fonction qui gere l'impression tu la créer à part enfaite ? et tu fait appelle à elle dans ton programme principale ?

    Merci de ton aide je suis u peu perdu sur ces point la !

  14. #14
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Points : 141
    Points
    141
    Par défaut
    bah en fait, ma classe Administration appelle par le biais d'un objet ObjGestionImpression les méthodes nécessaires pour imprimer un fichier etc..;

    Ca peut être aussi des classes qui contiennent des requête SQL. Par exemple, j'ai une classe Adherent qui gère l'ajout d'un nouvel adherent, des infos relatives a l'état civil d'une personne.

    Administration va instancier GestionAdherent et fournir à cette dernière les infos pour enregistrer dans une bdd ce que j'ai saisi sur mes Form.

    Le but des classes de services, est de pouvoir les utiliser n'importe où, donc de les rendre portable pour pouvoir les instancier dans n'importe quel projet.
    Ou bien si tu dois modifier ton projet pour une raison ou un autre, tu ne modifie non pas tout ton code source, mais uniquement une classe par exemple.
    Parce que les classes de services, recoivent en paramètres ce que tu leur envoie par le biais d'une classe administration (pour mon cas)..et donc si tu dois modifier quelque chose, normalement ca sera la classe administration.

    Pour ma classe impression, je l'ai créé dans mon projet, avec différentes méthodes qui recoivent certains paramètres, et ensuite quand j'ai besoin d'imprimer, mon bouton "impression" fait appel à administration, qui doit gérer ce que je dois imprimer (le contenu d'un StringGrid par ex) et envoie ensuite les valeurs (de types alphanumériques) à la classe GestionImpression, qui quelque soit mon imprimante lancera l'impression de mes caractères.

    Pour le moment je me limite à du text only, car l'impression n'est pas une chose que j'ai eu le temps de maitriser, mais quand j'aurai terminé, je pourrai t'envoyer un bout de code pour t'éclairer...mais au pire notre ami google est la

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    oui je veux bien un bout de ton code pour peut etre mieux comprendre.

    Je vois le principe mais je ne comprends pas trop comment le mettre en place.

    Je vois pas comment une classe va pouvoir aller instancier une autre.

    Je comprends le principe de portabilité (car c'est ce que je dois faire avec mon projet en cours).

    Mais je pensais créer mes différents fonciton séparement puis les inclure comme des librairies dans mon programme principale...

    Mais j'ai encore bcp de mal à me dire que la fonction que je vais créer va puvoir etre reutilisable. Je me dis que forcement quelque chose dvra changer dans cette fonction ... c'est mon premier programme qui doit fonctionner avec des fonctions portables ! Je suis encore novice!

    merci de ton aide en tout cas!

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

Discussions similaires

  1. Utilisation des templates ou allocation dynamique
    Par PilloBuenaGente dans le forum Débuter
    Réponses: 4
    Dernier message: 12/05/2013, 19h20
  2. Allocation dynamique / new
    Par gooze dans le forum Débuter
    Réponses: 5
    Dernier message: 17/02/2009, 10h52
  3. Réponses: 8
    Dernier message: 20/11/2006, 00h13
  4. Allocation Dynamique de Memoire Avec Operateur New
    Par msstaf dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/06/2006, 15h49
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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