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 :

protection de new


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 1
    Points : 1
    Points
    1
    Par défaut protection de new
    Bonjour, en C je devais toujours protéger malloc en cas d'erreur. Comment protège-t-on new ou doit-on le protéger? Est-ce qu'en cas d'erreur new retourne un nullptr ou bien une exception. Ce n'est pas très clair pour moi en essayant de lire sur le net. Je vous remercie d'avance!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 668
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 668
    Points : 10 669
    Points
    10 669
    Par défaut
    operator new, documentation cplusplus.com en anglais

    On failure, it throws a bad_alloc exception.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 339
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 339
    Points : 1 955
    Points
    1 955
    Par défaut
    Salut,

    Oublie l'opérateur New,
    en C++ modèrne, on utilise les pointeurs intelligents (std::unique_ptr, std::shared_ptr ect ...) qui s'occupent de gérer la mémoire à ta place.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Salut,

    Oublie l'opérateur New,
    en C++ modèrne, on utilise les pointeurs intelligents (std::unique_ptr, std::shared_ptr ect ...) qui s'occupent de gérer la mémoire à ta place.
    Les pointeurs intelligents ne contournent pas new. Les fonctions libres qui retournent un (std::make_unique(), std::make_shared()) le font.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 339
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 339
    Points : 1 955
    Points
    1 955
    Par défaut
    Qui a dit que ça contournait ?

    Les pointeurs intelligents ont été introduit avec C++11, dans le but de se débarrasser de la gestion manuelle des ressources.
    C++14 a introduit les fonction std::make_ dans le but de se débarrasser de l'opérateur new.
    Depuis, l'un ne va pas sans l'autre.

    Et sauf raison valable, un code source moderne n'a aucune raison d'utiliser l'opérateur new.

  6. #6
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 745
    Points : 3 660
    Points
    3 660
    Par défaut
    Citation Envoyé par deedolith Voir le message
    C++14 a introduit les fonctions std::make_ dans le but de se débarrasser de l'opérateur new.
    Plutôt dans l'objectif d'éviter une subtile fuite mémoire en utilisant std::unique_ptr et new séparément.

    Dans l'expression foo(std::unique_ptr<T>{new T}, bar()), si bar() lance une exception avant la construction du unique_ptr, mais après le new, il y a une fuite mémoire (l'ordre d'évaluation n'étant pas défini). En regroupant de manière atomique la construction du unique_ptr et l'appel au new, cette fuite mémoire n'est plus possible.

    La version make_shared était présente dès C++11 pour des raisons d'optimisations: une seule allocation qui regroupe le type T et le bloc de contrôle interne.

    Mais avant C++20 et les make_*_for_overwrite, le passage par new est obligatoire si on veut une initialisation par défaut.

    Mais sinon je suis d'accord, on délègue la libération de la mémoire aux pointeurs intelligents et les erreurs d'allocation / construction passe par les exceptions.

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

Discussions similaires

  1. La meilleure protection contre le piratage des logiciels ?
    Par iubito dans le forum Débats sur le développement - Le Best Of
    Réponses: 184
    Dernier message: 23/12/2008, 13h35
  2. Bug new build ??
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 31/01/2003, 10h30
  3. [] Insérer DE et Datareport existant ds new projet
    Par khany dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/01/2003, 09h52
  4. [VBA-E] [Excel] Protection d'une plage de cellules
    Par fikou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/11/2002, 11h28

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