Bonjour tout le monde,
Aujourd'hui avec le C++ moderne (C++11 et C++14), on incite les développeurs à utiliser les smart pointers (les pointeurs intelligents). Pour ma part je trouve que cela dénature un peu le C++ de base car on a un objet surchargé qui va gérer un autre objet mais… s'ils existent c'est qu'il y a des raisons à cela. L'intérêt de ces "conteneur d'instance" (c'est peut-être mal dit de ma part pour les puristes) est d'éviter les fuites de mémoire à cause des risques d'oublie du mot-clé delete… ma question est "Est-ce que cela gère tous les cas pour autant ?"
Soit l'exemple ci-dessous :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <iostream> #include <memory> using namespace std; class A { public: A(){ // Allocation d'un très gros tableau } }; int main() { A* a = new A(); return 0; } |
1- En instanciant l'objet A on va essayer d'allouer un très gros tableau (ligne 8), il est dit dans la FAQ d'isocpp qu'il suffit de lancer explicitement une exception à partir du constructeur pour qu'il n'y ait pas de fuite de mémoire (lien), mais encore faut-t-il connaitre la raison de son exception : Comment gérer les cas spécifiques où par exemple on alloue un tableau alors qu'il n'y a plus suffisamment d'espace ? Ou tout autre exception de raison inconnue ?
Même exemple avec le main() différent :
1 2 3 4 | int main() { unique_ptr<A> a(new A()); return 0; } |
2- Y a-t-il une fuite de mémoire dans cet exemple ? (voir ligne 14)
Reprenons l'exemple précédent et remplaçons juste la ligne 2 par ceci :
1 2 3 4 | int main() { unique_ptr<A> a = make_unique<A>(); return 0; } |
3- C'est make_unique qui instancie un objet A dont le constructeur lance une exception. make_unique a l'avantage à faire oublier le mot-clé new au développeur, mais je suis sur que ce n'est pas sa seule raison d'être. Est-ce que make_unique empêche en interne la fuite de mémoire par rapport aux exemples précédents ?
Merci