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

Langage C++ Discussion :

Opérateur new[] et template


Sujet :

Langage C++

  1. #21
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Je vois pas trop ce qu'il y a à détailler.
    Pour différer la construction il suffit d'appeler le constructeur sur une zone mémoire brute, qui peut très bien être allouée sur la pile par exemple.

    Ce qui signifie alors qu'il ne faut appeler le destructeur explicitement et que si le constructeur a bien été appelé etc. On a d'ailleurs les mêmes problèmes avec l'allocation dynamique.
    On peut fortement limiter ces problèmes on enveloppant ça dans une classe qui utilise en plus un booléen pour savoir si la mémoire est initialisée ou pas. C'est ce qu'est boost.optional.

    De toutes manières, tu ne devrais pas avoir à différer la construction. Ici le problème c'est parce que tu utilises des tableaux. Utilise std::vector à la place et plus de problème.
    Boost ftw

  2. #22
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Je ne peux pas utiliser std::vector, il faut lire !
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  3. #23
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Je vois pas trop ce qu'il y a à détailler.
    Pour différer la construction il suffit d'appeler le constructeur sur une zone mémoire brute, qui peut très bien être allouée sur la pile par exemple.

    Ce qui signifie alors qu'il ne faut appeler le destructeur explicitement et que si le constructeur a bien été appelé etc.
    Ca s'appelle un placement new. Je ne vois pas vraiment l'intérêt d'utiliser cette technique dans du code en dehors de l'écriture d'un allocateur.

    On a d'ailleurs les mêmes problèmes avec l'allocation dynamique.
    Quels problèmes ? Celui d'appeler explicitement le destructeur ? Cette solution est complexe et fortement sujette à erreurs (notamment parce qu'on oblige à appeler le destructeur explicitement, ce qui n'est pas vraiment naturel).

    On peut fortement limiter ces problèmes on enveloppant ça dans une classe qui utilise en plus un booléen pour savoir si la mémoire est initialisée ou pas. C'est ce qu'est boost.optional.
    On peut aussi lever des exceptions depuis les constructeurs pour signifier que quelque chose s'est mal passé.

    De toutes manières, tu ne devrais pas avoir à différer la construction. Ici le problème c'est parce que tu utilises des tableaux. Utilise std::vector à la place et plus de problème.
    Absolument d'accord. J'aimerais aussi comprendre pourquoi cette restriction sur l'utilisation de std::vector...
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  4. #24
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    La question du std::vector est (apparemment, moi je ne fais que faire ce que l'on me demande) une raison de portabilité du code.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  5. #25
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Portabilité ? Mais c'est standard ! Donc ça devrait être portable !!
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  6. #26
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Par curiosité, comment changer le code pour utiliser std::vector ?
    Et puis, si je veux faire passer l'idée, il me faut argumenter (et sec !), donc prouver que c'est mieux, et expliquer que ça fonctionnera dans tous les cas...
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  7. #27
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    C'est simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<QuelqueChose> v;
    v.push_back(QuelqueChose(/*...*/));//ajoute un élément en fin de vecteur
    Les vecteurs sont des tableaux dynamiques (ce qui permet de ne pas avoir à connaître leur taille par avance). On peut utiliser tous les algorithmes standards dessus (voir l'entête algorithm), ce qui évite de réinventer la roue, et son utilisation est parfaitement semblable à celle des tableaux (accès aux éléments via l'opérateur [] notamment, ou par la fonction at pour checker les bornes).

    Pour plus d'informations, il vaut mieux lire la doc dessus (ici par exemple).
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  8. #28
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Dans mon cas, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QuelqueChose tableau[2];
    Je peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<QuelqueChose> tableau[2];
    ?

    Du coup, je conserve mes delete ?
    Qu'est-ce que ça change concrètement quand à ma classe ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  9. #29
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<QuelqueChose> tableau;
    suffit

    Les méthodes pour rajouter des éléments sont:
    push_back() : vers la fin
    push_front() : au début
    insert() : ou tu veux (moins rapide)

    Après, tu peux réserver de la mémoire si tu veux, mais ce n'est pas nécessaire, avec la méthode reserve();

    Voilà!

  10. #30
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    std::vector<QuelqueChose> tableau[2];
    Non juste :
    std::vector<QuelqueChose> tableau;
    Si tu veux réserver deux emplacements, tu fais :
    std::vector<QuelqueChose> tableau(2);
    qui appelle le constructeur de std::vector en réservant deux emplacements.

    Du coup, plus besoin d'appeler delete car le vector sera détruit en même temps que l'objet englobant. Attention cependant : si le vecteur contient des pointeurs, il faudra les détruire soit même (le conteneur n'a pas cette responsabilité).
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

Discussions similaires

  1. Surcharge de l'opérateur new
    Par :Bronsky: dans le forum C++
    Réponses: 17
    Dernier message: 27/10/2010, 21h33
  2. Redéfinition opérateurs new et delete globaux
    Par bolhrak dans le forum C++
    Réponses: 8
    Dernier message: 30/07/2007, 11h34
  3. opérateur new visual c++
    Par zerocoolyoussef dans le forum Visual C++
    Réponses: 4
    Dernier message: 20/11/2006, 20h01
  4. Différence opérateur new et constructeur
    Par Burckel dans le forum C++
    Réponses: 7
    Dernier message: 16/11/2006, 10h21
  5. namespace et opérateur new
    Par Sylvain Rousseau dans le forum C++
    Réponses: 3
    Dernier message: 06/01/2005, 23h24

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