Suppresseurs personnalisés et fonctions make
Utiliser std::make_unique, std::make_shared et des suppresseurs personnalisés pour les ressources autres que la mémoire
Suppresseurs personnalisés et fonctions make est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.
Pourquoi utiliser des fonctions de libération personnalisées ?
Toutes les ressources ne sont pas libérées avec delete. Les descripteurs de fichiers, les sockets, les ressources propres au système d’exploitation et les tableaux nécessitent chacun une fonction de nettoyage différente.
Fonction de libération par défaut de unique_ptr
Par défaut, unique_ptr<T> utilise delete. Pour les tableaux, utilisez unique_ptr<T[]>, qui appelle delete[].
Spécifier une fonction de libération personnalisée
Passez un objet appelable comme deuxième argument du modèle. La fonction de libération reçoit le pointeur brut et le libère de manière appropriée.
auto closer = [](FILE* f) { if (f) std::fclose(f); };
std::unique_ptr<FILE, decltype(closer)> file(
std::fopen("data.txt", "r"), closer);Fonction de libération pour shared_ptr
shared_ptr stocke sa fonction de libération dans le bloc de contrôle : le type est effacé, donc le type de shared_ptr lui-même ne change pas.
std::shared_ptr<FILE> file(
std::fopen("data.txt", "r"),
[](FILE* f) { if (f) std::fclose(f); }
);Cas courants d’utilisation de fonctions de libération personnalisées
Exemples concrets :
- Descripteurs de bibliothèques C (FILE*, sqlite3*, descripteurs curl)
- Ressources du système d’exploitation (HANDLE sous Windows, fd sous Unix)
- Réserves mémoire personnalisées
- Objets externes dont les références sont comptées
std::make_unique (C++14)
La méthode recommandée pour créer un unique_ptr. Elle transmet les arguments au constructeur et évite d’utiliser new brut.
auto p = std::make_unique<Widget>(arg1, arg2);Pourquoi utiliser make_unique ?
Trois avantages :
- Sûreté vis-à-vis des exceptions : aucun
newbrut dans le code utilisateur - Il n’est pas nécessaire d’écrire le type deux fois
- Il est impossible de transmettre accidentellement le pointeur brut à deux unique_ptr
std::make_shared
Pour shared_ptr, make_shared alloue le bloc de contrôle et l’objet dans une seule allocation sur le tas, ce qui est plus rapide que deux allocations distinctes.
auto p = std::make_shared<Widget>(arg1, arg2);Quand make_shared présente des inconvénients
L’allocation unique signifie que la mémoire de l’objet n’est libérée que lorsque tous les weak_ptr ont également disparu. Si vos weak_ptr survivent aux shared_ptr, préférez la construction en deux étapes.
Associer des fonctions de libération personnalisées aux fonctions make
make_unique et make_shared n’acceptent pas directement de fonction de libération personnalisée. Dans ce cas, construisez manuellement le pointeur intelligent.
// make_shared cannot take a deleter
std::shared_ptr<FILE> file(
std::fopen("data.txt", "r"),
[](FILE* f) { if (f) std::fclose(f); }
);Piège : type d’une lambda comme paramètre de modèle
Chaque lambda possède un type unique. Pour unique_ptr, utilisez decltype(my_deleter) lors de la déclaration, ou utilisez une fonction nommée ou un pointeur de fonction pour conserver des types simples.
Vérification rapide
Quelle fonction de fabrique vous permet-elle d’allouer un std::shared_ptr et son bloc de contrôle dans une seule allocation sur le tas ?
Récapitulatif
Utilisez make_unique et make_shared dans les cas courants. Fournissez une fonction de libération personnalisée (une lambda ou une fonction) lorsque la ressource nécessite autre chose que delete : descripteurs de fichiers, objets du système d’exploitation ou nettoyage de bibliothèque C.
Questions Fréquemment Posées
La leçon « Suppresseurs personnalisés et fonctions make » est-elle gratuite ?
Oui — le texte complet de « Suppresseurs personnalisés et fonctions make » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Suppresseurs personnalisés et fonctions make » ?
Utiliser std::make_unique, std::make_shared et des suppresseurs personnalisés pour les ressources autres que la mémoire Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C++ Academy ?
Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Suppresseurs personnalisés et fonctions make » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?
Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Pourquoi les pointeurs intelligents remplacent new et delete bruts
- unique_ptr : propriété exclusive
- shared_ptr et weak_ptr : propriété partagée
- Suppresseurs personnalisés et fonctions make